Asp.net mvc 从视图到控制器不保留对象值

Asp.net mvc 从视图到控制器不保留对象值,asp.net-mvc,razor,Asp.net Mvc,Razor,我使用模型将值从控制器传递到模型。假设我有第一个控制器动作方法: public ActionResult CreateADForm(SiteDirectionModel model){ MyModel myModel= new MyModel{ id = model.id, name = model.name, //an so on siteDirection = model

我使用模型将值从控制器传递到模型。假设我有第一个控制器动作方法:

    public ActionResult CreateADForm(SiteDirectionModel model){
        MyModel myModel= new MyModel{
            id = model.id, 
            name = model.name,
            //an so on
            siteDirection = model //a SiteDirectionModel object
        };
        return View(myModel);
    }
此方法的要点是预加载一些值,然后将其传递给具有以下表单的视图:

@model MyProject.Models.MyModel
@using (Html.BeginForm("ValidateForm", "Create", FormMethod.Post))
        {
            @Html.AntiForgeryToken()
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(m=>m.name, new { @class= "col-md-2 control-label" })
                <div class="col-md-10">
                    @Html.TextBoxFor(m => m.name, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.name, "", new { @class = "text-danger" })
                </div>
            </div>
            <input type="submit" value="Créer l'utilisateur" class="btn btn-primary" />
@model MyProject.Models.MyModel
@使用(Html.BeginForm(“ValidateForm”、“Create”、FormMethod.Post))
{
@Html.AntiForgeryToken()

@Html.ValidationSummary(true,“,new{@class=“text danger”}) @LabelFor(m=>m.name,新的{@class=“col-md-2控制标签”}) @TextBoxFor(m=>m.name,新的{@class=“form control”}) @Html.ValidationMessageFor(m=>m.name,“,new{@class=“text danger”})

我的问题是,现在当我验证此表单时,我尝试检索
SiteDirectionModel siteDirection
,但它始终为空。我想这样做,以便在表单无效的情况下,我返回到显示错误的表单(例如未填充的文本框),但这是不正常的。我猜在填写表单时必须对值进行属性化,这就是为什么我一直使用空值的原因,但是您知道如何做到这一点吗?

表单验证发生在到服务器的往返完成后(即表单发布后)。 因此,您必须将接收操作中需要的所有值发送回服务器

为所需的
siteDirection
属性添加隐藏字段

@Html.HiddenFor(m => m.siteDirection.Name)
@Html.HiddenFor(m => m.siteDirection.Value)
@* ... *@

或者,发送siteDirection的ID并再次从DB加载此实体。

您的
SiteDirectionModel
是什么样子的?这里唯一的表单元素是一个名为
name
的文本输入。a for仅回发其表单控件的名称/值对。如果您不为的每个属性创建控件e> SiteDirectionModel那么它将不会被绑定。但是在任何情况下,你应该只发回
SiteDirectionModel
@David I最小化的ID以使其可测试。但是
SiteDirectionModel
有20多个变量。@StephenMuecke为什么只有ID?你的意思是
MyModel
的ID?不,只是
站点的IDDirectionModel
-在视图中包含所有额外的html并再次将其发送回只会降低性能。如果出于某种原因您再次需要该模型,请根据我尝试使用的IDSo从数据库中获取该模型这样我可以从我的数据库中重新加载条目,但是在我的控制器操作方法中检索到的id总是空的。这很奇怪,在
MyModel MyModel=new MyModel{id=model.id};
?是的,我成功地传递了它,并且它在我的视图中有一个值。我还尝试了
@Html.HiddenFor(m=>m.id,new{@Value=Model.id})
毫无疑问,我发现了我的错误,它是由于错误地使用了
重定向到操作
。谢谢!