使用 ViewModel 设置 MVC 表单,但想在回发中绑定到视图模型的对象。这可能吗?
Using ViewModel to setup MVC Form but want to bind to object of the viewmodel in the postback. Is this possible?
只需要知道这是否可行,或者 MVC 中的标准做法到底是什么,因为这是我的第一个大型 MVC 应用程序。
所以我有一个表单我希望用户能够编辑并在该表单页面上提取我需要的所有必要数据我正在引入一个视图模型,
public class Tier2IssueFormViewModel
{
public Tier2IssueDTO Tier2Issue { get; set; }
public IEnumerable<SelectListItem> VersionList { get; set; }
public IEnumerable<SelectListItem> BugList { get; set; }
public IEnumerable<SelectListItem> IssueStatusList { get; set; }
}
然后,一旦我使用诸如
之类的方式从用户那里收集完表单数据
@Html.TextBoxFor(m => m.Tier2Issue.Tier2Notes, new { @class = "form-control"})
@Html.DropDownListFor(m => m.Tier2Issue.FishbowlVersion, Model.VersionList, "Select Application Version")
@Html.HiddenFor(m => m.Tier2Issue.ID)
我想 post 返回此操作,并为我的模型绑定以下签名,
[HttpPost]
[Route("Issues/{id}/Edit")]
public ActionResult EditIssue(Tier2IssueDTO model)
{
...
// Update DB with the DTO model
...
}
但是到目前为止,没有任何东西真正绑定到这个对象。我认为模型活页夹可能足够聪明,可以将两者配对,但我猜这个逻辑是不正确的。所以我目前正在使用它来解决问题,
[HttpPost]
[Route("Issues/{id}/Edit")]
public ActionResult EditIssue(Tier2IssueFormViewModel model)
{
...
// Get Tier2IssueDTO values from viewmodel
// Update DB with the DTO model
...
}
我的意思是它有效,但我觉得您将模型绑定到视图模型似乎很奇怪。这是标准做法还是有办法直接绑定到视图模型中包含的对象?
你有权这样做。有一个 viewmodel、dto 和实体似乎都具有相同的属性,这通常看起来很重复,但它们都做不同的工作,通常最终会有点不同。 dto 可以充当视图模型,但它是圆孔中的方形钉。如果您不使用 automapper 将这些对象彼此映射(这可能是基于意见但它被广泛共享) - 然后使用 automapper 来节省您的盲目击键。
这将不起作用,因为输入文本框的名称与您操作中的模型不同,例如:文本框的名称为 Tier2Issue.Tier2Notes
,而操作中的模型参数需要 属性 名称 Tier2Notes
只有没有 Tier2Issue
前缀。
您可以通过使模型与动作参数相同或为文本框提供明确的名称和值来解决此问题,例如:
@Html.TextBox("Tier2Notes",Model.Tier2Issue.Tier2Notes, new { @class = "form-control"})
这应该可以正常工作
只需要知道这是否可行,或者 MVC 中的标准做法到底是什么,因为这是我的第一个大型 MVC 应用程序。
所以我有一个表单我希望用户能够编辑并在该表单页面上提取我需要的所有必要数据我正在引入一个视图模型,
public class Tier2IssueFormViewModel
{
public Tier2IssueDTO Tier2Issue { get; set; }
public IEnumerable<SelectListItem> VersionList { get; set; }
public IEnumerable<SelectListItem> BugList { get; set; }
public IEnumerable<SelectListItem> IssueStatusList { get; set; }
}
然后,一旦我使用诸如
之类的方式从用户那里收集完表单数据@Html.TextBoxFor(m => m.Tier2Issue.Tier2Notes, new { @class = "form-control"})
@Html.DropDownListFor(m => m.Tier2Issue.FishbowlVersion, Model.VersionList, "Select Application Version")
@Html.HiddenFor(m => m.Tier2Issue.ID)
我想 post 返回此操作,并为我的模型绑定以下签名,
[HttpPost]
[Route("Issues/{id}/Edit")]
public ActionResult EditIssue(Tier2IssueDTO model)
{
...
// Update DB with the DTO model
...
}
但是到目前为止,没有任何东西真正绑定到这个对象。我认为模型活页夹可能足够聪明,可以将两者配对,但我猜这个逻辑是不正确的。所以我目前正在使用它来解决问题,
[HttpPost]
[Route("Issues/{id}/Edit")]
public ActionResult EditIssue(Tier2IssueFormViewModel model)
{
...
// Get Tier2IssueDTO values from viewmodel
// Update DB with the DTO model
...
}
我的意思是它有效,但我觉得您将模型绑定到视图模型似乎很奇怪。这是标准做法还是有办法直接绑定到视图模型中包含的对象?
你有权这样做。有一个 viewmodel、dto 和实体似乎都具有相同的属性,这通常看起来很重复,但它们都做不同的工作,通常最终会有点不同。 dto 可以充当视图模型,但它是圆孔中的方形钉。如果您不使用 automapper 将这些对象彼此映射(这可能是基于意见但它被广泛共享) - 然后使用 automapper 来节省您的盲目击键。
这将不起作用,因为输入文本框的名称与您操作中的模型不同,例如:文本框的名称为 Tier2Issue.Tier2Notes
,而操作中的模型参数需要 属性 名称 Tier2Notes
只有没有 Tier2Issue
前缀。
您可以通过使模型与动作参数相同或为文本框提供明确的名称和值来解决此问题,例如:
@Html.TextBox("Tier2Notes",Model.Tier2Issue.Tier2Notes, new { @class = "form-control"})
这应该可以正常工作