我对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方法中填充SelectedSocialSites
的SocialSitePost
类的属性吗?
另外,有人可以告诉我我在这里做错什么了吗,因为到目前为止我在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] 删除。
我来说两句