Asp.net mvc 2 如何将可空属性从ASP.NET视图传递到控制器?
我已经阅读stackoverflow好几年了,但这是我第一次真正需要发布一个问题,因为我似乎在任何地方都找不到合适的答案 问题是,我想给一个对象传递一个LinqToSQL实体,以精确到我的视图,允许用户添加一些属性,然后将其发回保存 我的对象名为Permission,它有一些属性id、forpost、forcomment、user、starting、hours和一些相关的实体引用。forpost和forcomment实体可以为空,因为用户可以因发表攻击性帖子或攻击性评论而被认证。请注意forpost指的是一个想法实体,我不知道我在想什么叫它post 这是我的控制器逻辑:Asp.net mvc 2 如何将可空属性从ASP.NET视图传递到控制器?,asp.net-mvc-2,Asp.net Mvc 2,我已经阅读stackoverflow好几年了,但这是我第一次真正需要发布一个问题,因为我似乎在任何地方都找不到合适的答案 问题是,我想给一个对象传递一个LinqToSQL实体,以精确到我的视图,允许用户添加一些属性,然后将其发回保存 我的对象名为Permission,它有一些属性id、forpost、forcomment、user、starting、hours和一些相关的实体引用。forpost和forcomment实体可以为空,因为用户可以因发表攻击性帖子或攻击性评论而被认证。请注意forpo
[Authorize(Roles = "Admin, Moderator")]
public ActionResult ProbateUser(int? post, int? comment)
{
if (post != null)
{
Idea idea = irep.GetIdea(post ?? 0);
Probation probation = new Probation
{
user = (Guid)idea.user,
Idea = idea
};
return View(probation);
}
if (comment != null)
{
Comment rcomment = crep.GetComment(comment ?? 0);
Probation probation = new Probation
{
user = rcomment.user,
Comment = rcomment
};
return View(probation);
}
return View("NotFound");
}
[AcceptVerbs(HttpVerbs.Post)]
[Authorize]
public ActionResult ProbateUser(Probation probation, FormCollection values)
{
try
{
probation.starting = DateTime.Now;
rep.ProbateUser(probation);
rep.Save();
return RedirectToAction("Index");
}
catch
{
return View("NotFound");
}
}
}
这是使用隐藏字段存储预设值的视图:
<fieldset>
<legend>Fields</legend>
<%: Html.Hidden("Idea", Model.Idea)%>
<%: Html.Hidden("Comment", Model.Comment)%>
<%: Html.Hidden("user", Model.user) %>
<div class="editor-label">
<%: Html.LabelFor(model => model.reason) %>
</div>
<div class="editor-field">
<%: Html.TextAreaFor(model => model.reason) %>
<%: Html.ValidationMessageFor(model => model.reason) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.hours) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.hours) %>
<%: Html.ValidationMessageFor(model => model.hours) %>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
现在我的问题是,一旦试用对象被发回,forcomment和forpost的可空字段总是空的
总结一下:从控制器->视图->控制器传递具有可为空属性的对象的正确方法是什么?漂亮吗?这是因为MVC的无状态性。如果希望这些字段保留其值,则需要将它们放在隐藏字段中,以便在post期间将它们绑定回,如:
...
<legend>Fields</legend>
<%: Html.Hidden("Idea", Model.Idea)%>
<%: Html.Hidden("Comment", Model.Comment)%>
<%: Html.Hidden("user", Model.user) %>
<%: Html.Hidden("user", Model.ForPost) %>
<%: Html.Hidden("user", Model.ForComment) %>
<div class="editor-label">
...
好的,从我在这里和其他论坛上的评论中收集到的信息来看:根本没有办法传递可为空的字段并将其发回。我的解决方法是构建一个部分试用类,将两个不可为null的值字段添加到试用实体中,并在回发后使用这些字段填充字段。
作为一个更好的选择,制作ViewModels也会起作用。但这正是我现在正在做的??还是我在这里遗漏了什么?问题是,使用此方法时,所有可为null的字段(无论值如何)都设置为null。我可以毫无问题地拥有常规属性。