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

本文关键字:填充 模型 嵌套 对象 列表 选择 复选框 ASP NET MVC 基于 | 更新日期: 2023-09-27 18:04:33

我对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操作方法中,我从会话中检索用户对象,并检查注册的社交帐户。我还创建了一个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();
 }

我没有强类型视图。我需要做的是发布用户响应。所以我创建了一个表单来张贴。现在在这个表单中,我想为所有注册的社交帐户显示一个复选框(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>
      }
 }

说够了现在我真正的问题

当用户选择任何复选框时,我希望填充SocialSitePost对象的SelectedSocialSites属性。这是表单正在过帐回其对象的模型。我需要能够访问POST方法中的SelectedSocialSites属性。我的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方法中填充的SocialSitePost类的SelectedSocialSites属性吗?

此外,有人能告诉我我是否做错了什么吗?因为到目前为止,我在so上还没有发现任何类似于这种情况的问题?

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

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

这些是我最终设计的ViewModels:

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)
}