我尝试在我的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;
答案 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
的字段。但是,这是一个全局性更改,会影响Requests
与EditorFor
实例的任何使用。
更有可能的是,您最好的选择就是直接在视图中为上述每个属性手动调用Requests
。
答案 2 :(得分:0)
您可以将对象作为模型传递给视图,但是当您想要将对象的数据发送回控制器时,您无法发送对象,您必须使用具有相同属性名称的原始变量对象