基于ASP.NET MVC中的复选框选择填充模型的嵌套列表对象

萨特维克·纳德卡尼

我对ASP.NET MVC还是比较陌生,在汤之类的情况下,我发现自己有点坚守门槛。这是长度说明,请耐心等待。很抱歉,这似乎有点漫长而无聊:)。所以,这是我的问题:

这是我的模型。

public class SocialAccount
{
    public int SocialAccountID { get; set; }

    public int UserID { get; set; }

    public int SocialSiteID { get; set; }

    public string SocialAccountUsername { get; set; }

    public string SocialAccountUserID { get; set; }

    public string OAuthToken { get; set; }

    public string Captcha { get; set; }

    public string UserCaptchaValue { get; set; }
}

public class SocialSitePost
{
    public int PostID { get; set; }

    public string PostContent { get; set; }

    public string PostAttachments { get; set; }

    public List<SocialSite> SelectedSocialSites { get; set; }

    public List<SocialAccount> SocialAccount { get; set; }

}

public class SocialSite : Audit
{
   public int SocialSiteID { get; set; }
   public string SocialSiteName { get; set; }     
}

成功验证用户身份后,我会将一些用户详细信息存储在会话中,然后重定向到主页。这是该代码:

//action method in some Controller
public Login()
{
     //Authenticate user

     //Get all social account related information
     SomeRepository someRepository = new SomeRepository();
     List<SocialAccount> socialAccountDetails = someRepository.SomeMethod(user.UserID);

     //Add social account related information to session
     HttpHelper.StoreInSession("UserDetails", socialAccountDetails);

     //redirect to HomePage
     return RedirectToAction("HomePage", "Account");
}

在HomePage操作方法中,我从会话中检索用户对象并检查已注册的社交帐户。我还创建了一个list对象,SocialSite以维护所有已注册社交网站的列表。然后,我将其打包ViewData并发送到视图。这是该代码:

//action method in some other controller
public ActionResult HomePage()
{
     List<SocialSite> allSocialSites = null;
     List<SocialAccount> userSocialAccountDetails = HttpHelper.RetrieveFromSession("UserSocialSiteDetails") as List<SocialAccount>;

     if (userSocialAccountDetails != null && userSocialAccountDetails.Count != 0)
     {
          allSocialSites = new List<SocialSite>();
          bool hasFacebookAccount = userSocialAccountDetails.Exists(x => x.SocialSiteID == Convert.ToInt32(CommonConstants.SocialSite.Facebook));
          if (hasFacebookAccount)
          {
               allSocialSites.Add(new SocialSite() { SocialSiteID = 1, SocialSiteName = "Facebook" });
          }
          bool hasTwitterAccount = userSocialAccountDetails.Exists(x => x.SocialSiteID == Convert.ToInt32(CommonConstants.SocialSite.Twitter));
          if (hasTwitterAccount)
          {
               allSocialSites.Add(new SocialSite() { SocialSiteID = 2, SocialSiteName = "Twitter" });
          }
     }
     ViewData["SocialSites"] = allSocialSites;
     return View();
 }

我没有强类型的观点。我需要做的是发布用户回复。因此,我创建了一个POST表单。现在在此表单中,我想为所有注册的社交帐户显示一个复选框(ViewData会给我此信息)。因此,可以说,如果用户A仅注册了一个Facebook帐户,则仅应显示一个代表Facebook的复选框。如果用户B注册了一个Facebook,Twitter和Instagram帐户,则应显示3个复选框,每个复选框代表一个社交帐户。我想你明白了。这是我的代码:

@model SocialSitePost
@{
      using (Html.BeginForm("ProcesssRequest", "Account", FormMethod.Post))
      {
           <div class="divProcessRequest">
               <br />
               <div>
                   @Html.TextAreaFor(model => model.PostContent)
               </div>
               <div>
                   @foreach (var socialSite in ViewData["SocialSites"] as List<SocialSite>)
                   {
                        @Html.CheckBox("SocialSiteID", new { value = socialSite.SocialSiteID, @checked = true });
                        @Html.Label(socialSite.SocialSiteName)
                   }        //Tried this..And am able to display the checkbox

                   @*@for (int i = 0; i < Model.SelectedSocialSites.Count; i++)
                   {
                        @Html.CheckBoxFor("SocialSiteID", new { value = Model.SelectedSocialSites[i].SocialSiteID, @checked = true });
                   }*@        //Tried this too..I know this shouldn't work and rightly so, it doesn't work :)
               </div>
               <br />
               <div>
                   <input type="submit" id="btnPost" value="Post" />
               </div>
           </div>
      }
 }

说够了!!!现在我真正的问题是

当用户选中任何复选框时,我要填充对象SelectedSocialSites属性SocialSitePost这是表单要回发其对象的模型。我需要能够SelectedSocialSites在POST方法中访问该属性。这就是我的POST方法:

[HttpPost]
public ActionResult ProcessRequest(SocialSitePost post)
{
     if (ModelState.IsValid)
     {
          List<SocialSite> allSocialSites = ViewData["SocialSites"] as List<SocialSite>;        //Can't get anything here
          int socialSiteNo = post.SelectedSocialSites.SocialSiteID;    //This is what I want to be able to do
          return View("HomePage");
     }
}

因为我对ASP.NET MVC还是比较陌生,所以我不确定这是否是正确的方法。我确实尝试了一些类似EditorFor的方法,尝试SocialSitePost在第一次渲染视图时发送对象(我不想这样做,因为它没有任何逻辑意义)。

有人可以告诉我如何根据用户所做的复选框选择在POST方法中填充SelectedSocialSitesSocialSitePost属性吗?

另外,有人可以告诉我我在这里做错什么了吗,因为到目前为止我在SO上还没有发现任何类似于这种情况的问题?

萨特维克·纳德卡尼

这里的主要问题是该模型不完全适合需要显示的内容。也就是说,关于视图的模型格式及其在后端的表示形式是不同的。因此,这里需要使用ViewModel。这就是解决我的问题的方法。

这些是我最终设计的ViewModel:

public class SocialSiteViewModel : SocialSite
{
    public bool IsSelected { get; set; }

    public string SocialSitePostID { get; set; }
}

public class SocialSitePostViewModel : SocialSitePost
{
    public List<SocialSiteViewModel> SocialSiteViewModel { get; set; }
}

然后,我可以轻松地在视图上使用它们,例如:

using (Html.BeginForm("ActionMethodName", "ControllerName", FormMethod.Post))
{

    @Html.CheckBoxFor(x => x.SocialSiteViewModel[i].IsSelected)
    @Html.HiddenFor(x => x.SocialSiteViewModel[i].SocialSiteID)
    @Html.HiddenFor(x => x.SocialSiteViewModel[i].SocialSiteName)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对于大型嵌套复选框列表,ASP.NET MVC 表单 POST 非常慢

来自分类Dev

如何基于asp.net mvc4中的模型列表填充列表框?

来自分类Dev

C#ASP.NET复选框选择单个值

来自分类Dev

基于C#中的DropDownList在Asp.net Gridview中启用“禁用”复选框

来自分类Dev

如何通过asp.net mvc中的自定义jQuery验证复选框列表

来自分类Dev

asp.net中基于角色的授权

来自分类Dev

对于列表中未在 POST 中检查的记录,Asp.Net MVC 5 复选框状态不会保持不变

来自分类Dev

复选框列表值未绑定到 ASP.NET Core MVC 中的查看 GET 请求

来自分类Dev

我需要一个没有 EF 的 asp.net mvc 中带有复选框的下拉列表

来自分类Dev

ASP.NET MVC无法发布绑定到复选框的视图模型

来自分类Dev

基于单个模型的MVC ASP.NET多视图

来自分类Dev

如何基于注释[key]标签从ASP NET MVC模型对象中识别主键参数?

来自分类Dev

如何基于注释[key]标签从ASP NET MVC模型对象中识别主键参数?

来自分类Dev

如何在Asp.NET MVC中使用复选框创建MultiSelect下拉列表

来自分类Dev

ASP.NET MVC中的问题模型绑定嵌套列表

来自分类Dev

ASP.NET MVC中的问题模型绑定嵌套列表

来自分类Dev

MaterializeCSS-ASP。Net MVC:模态复选框

来自分类Dev

选中“ ASP.NET MVC提交表单”复选框

来自分类Dev

ASP NET MVC 4并排呈现复选框

来自分类Dev

ASP NET MVC 4并排呈现复选框

来自分类Dev

ASP.NET MVC复选框产生的HTML

来自分类Dev

从ASP.NET MVC中的FormCollection中获取复选框的值

来自分类Dev

ASP.NET MVC。如何基于参数禁用必需的验证?

来自分类Dev

ASP.NET MVC或者基于用户角色的渲染EditorFor

来自分类Dev

使用ASP.NET MVC进行基于声明的授权

来自分类Dev

ASP.NET MVC Core 3.1基于区域的路由

来自分类Dev

使用ASP.NET MVC进行基于声明的授权

来自分类Dev

ASP.NET MVC。如何基于参数禁用必需的验证?

来自分类Dev

如何从ASP.NET MVC的多个分页中获取所有选中的复选框?

Related 相关文章

  1. 1

    对于大型嵌套复选框列表,ASP.NET MVC 表单 POST 非常慢

  2. 2

    如何基于asp.net mvc4中的模型列表填充列表框?

  3. 3

    C#ASP.NET复选框选择单个值

  4. 4

    基于C#中的DropDownList在Asp.net Gridview中启用“禁用”复选框

  5. 5

    如何通过asp.net mvc中的自定义jQuery验证复选框列表

  6. 6

    asp.net中基于角色的授权

  7. 7

    对于列表中未在 POST 中检查的记录,Asp.Net MVC 5 复选框状态不会保持不变

  8. 8

    复选框列表值未绑定到 ASP.NET Core MVC 中的查看 GET 请求

  9. 9

    我需要一个没有 EF 的 asp.net mvc 中带有复选框的下拉列表

  10. 10

    ASP.NET MVC无法发布绑定到复选框的视图模型

  11. 11

    基于单个模型的MVC ASP.NET多视图

  12. 12

    如何基于注释[key]标签从ASP NET MVC模型对象中识别主键参数?

  13. 13

    如何基于注释[key]标签从ASP NET MVC模型对象中识别主键参数?

  14. 14

    如何在Asp.NET MVC中使用复选框创建MultiSelect下拉列表

  15. 15

    ASP.NET MVC中的问题模型绑定嵌套列表

  16. 16

    ASP.NET MVC中的问题模型绑定嵌套列表

  17. 17

    MaterializeCSS-ASP。Net MVC:模态复选框

  18. 18

    选中“ ASP.NET MVC提交表单”复选框

  19. 19

    ASP NET MVC 4并排呈现复选框

  20. 20

    ASP NET MVC 4并排呈现复选框

  21. 21

    ASP.NET MVC复选框产生的HTML

  22. 22

    从ASP.NET MVC中的FormCollection中获取复选框的值

  23. 23

    ASP.NET MVC。如何基于参数禁用必需的验证?

  24. 24

    ASP.NET MVC或者基于用户角色的渲染EditorFor

  25. 25

    使用ASP.NET MVC进行基于声明的授权

  26. 26

    ASP.NET MVC Core 3.1基于区域的路由

  27. 27

    使用ASP.NET MVC进行基于声明的授权

  28. 28

    ASP.NET MVC。如何基于参数禁用必需的验证?

  29. 29

    如何从ASP.NET MVC的多个分页中获取所有选中的复选框?

热门标签

归档