Asp.net mvc 2 如何将可空属性从ASP.NET视图传递到控制器?

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

我已经阅读stackoverflow好几年了,但这是我第一次真正需要发布一个问题,因为我似乎在任何地方都找不到合适的答案

问题是,我想给一个对象传递一个LinqToSQL实体,以精确到我的视图,允许用户添加一些属性,然后将其发回保存

我的对象名为Permission,它有一些属性id、forpost、forcomment、user、starting、hours和一些相关的实体引用。forpost和forcomment实体可以为空,因为用户可以因发表攻击性帖子或攻击性评论而被认证。请注意forpost指的是一个想法实体,我不知道我在想什么叫它post

这是我的控制器逻辑:

        [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。我可以毫无问题地拥有常规属性。