将ViewModel从HttpGet Action传递给HttpPost Action

时间:2015-09-09 16:28:19

标签: c# asp.net-mvc asp.net-mvc-5

我尝试在我的Action中初始化ViewModel然后将其传递给View,使用一些数据,然后将所有数据恢复到我的Action Post中使用,如下所示:

视图模型:

public class AddResponseModel
    {
        iDeskEntities db = new iDeskEntities();
        public AddResponseModel()
        {
            RespTypeList = new SelectList(db.ResponseType.Where(e=>e.type != "Assignar" && e.type != "Reabrir"), "type", "type");
            newRespList = new SelectList(db.Users, "id", "name");
        }

        [Required]
        [DataType(DataType.Text)]
        public string response { get; set; }

        [HiddenInput]
        public Requests request { get; set; }

        [HiddenInput]
        public string newResp { get; set; }

        [DataType(DataType.Text)]
        public SelectList newRespList { get; set; }

        [HiddenInput]
        public int RespType { get; set; }

        [Required]
        [DataType(DataType.Text)]
        public SelectList RespTypeList { get; set; }
    }

控制器:

[HttpGet]
        public ActionResult AddResponse(int? id)
        {
            AddResponseModel model = new AddResponseModel();
            model.request = db.Requests.Find(id);
            return View("AddResponse", model);
        }

[HttpPost]
        public ActionResult AddResponse(Requests req, AddResponseModel model)
        {
            //Some code, where i wanna access again model.request that i //initiated on the GET action
            return RedirectToAction("Dashboard", "BHome");
        }

查看:

@using (Html.BeginForm("AddResponse", "Requests", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true)

        @if (Model.request.state != 0)
        {
            <div class="form-group">
                @Html.LabelFor(model => model.RespType, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownListFor(model => model.RespType, Model.RespTypeList)
                    @Html.ValidationMessageFor(model => model.RespType)
                </div>
            </div>
        }

        <div class="form-group">
            @Html.LabelFor(model => model.response, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.response)
                @Html.ValidationMessageFor(model => model.response)
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Adicionar Resposta" class="btn btn-default" />
            </div>
        </div>
    </div>
}

反正有吗?因为当我尝试使用&#34; model.request&#34;在Post方法中,他来了&#34; null&#34;

3 个答案:

答案 0 :(得分:2)

仅对实际使用的字段进行绑定。如果您未在视图中使用请求属性,可能最好只将ID保存在隐藏的输入中,然后再次在POST的服务器上加载。对于州,只需将bool属性添加到模型中即可。

答案 1 :(得分:1)

您无法将单个字段(如隐藏输入)绑定到整个对象。如果您将对象传递给它,它只需要在其上调用ToString来获取表示,这很可能最终会像"{Namespace.To.Requests}"那样,而不是包含在其中的实际数据那个对象。

您可以为对象的每个属性显式创建输入,即:

@Html.HiddenFor(m => m.request.Foo)
@Html.HiddenFor(m => m.request.Bar)
@Html.HiddenFor(m => m.request.Baz)

或者您可以使用EditorFor让MVC按惯例为您执行此操作:

@Html.EditorFor(m => m.request)

当馈送整个对象时,EditorFor实际上会根据它从类中获取的信息(例如属性类型和应用的属性)挖掘并为该对象上的每个公共属性生成字段({{ 1}},DataType等。)

这意味着,它可能不会选择隐藏的字段。您可以使用UIHint属性注释类中的属性:

HiddenInput

但是,您不希望在类似实体类的内容上执行此操作,因为它会影响表单对此类的每次使用。在这些情况下经常使用视图模型,因为您可以根据需要创建一个单独的视图模型来表示实体,而不会影响应用程序的其他区域。

您还可以使用编辑器模板来定义应为对象呈现的字段集[HiddenInput] public string Foo { get; set; } 。只需添加视图EditorFor,只要您使用Views\Shared\EditorTemplates\Requests.cshtml实例调用EditorFor,它就会呈现该模板。然后,您可以在该视图中以任意方式呈现Requests的字段。但是,这是一个全局性更改,会影响RequestsEditorFor实例的任何使用。

更有可能的是,您最好的选择就是直接在视图中为上述每个属性手动调用Requests

答案 2 :(得分:0)

您可以将对象作为模型传递给视图,但是当您想要将对象的数据发送回控制器时,您无法发送对象,您必须使用具有相同属性名称的原始变量对象