gpt4 book ai didi

asp.net-mvc - ASP.NET MVC : using same ViewModel for rendering page and getting results

转载 作者:行者123 更新时间:2023-12-04 07:01:44 25 4
gpt4 key购买 nike

这是我使用的简单 View 模型:

public class ViewModel
{
public Order Order { get; set; }
// returned from page - also can be pre-selected
public string[] SelectedProducts { get; set; }
// data for page to render available products to select from
public IList<ProductViewModel> AvailableProducts { get; set; }
}

public ActionResult Edit(Order order)
{
return View(new ViewModel { Order = order, SelectedProducts = new string[0], AvailableProducts = repository.GetAvailable() });
}

(请注意,订单在 POST 上由自定义模型绑定(bind)器自动绑定(bind))

现在,我确实返回 View(new ViewModel(...)) 并且它可以工作。 GET/Edit 页面呈现可用产品,用户选择它们,然后提交从 SelectedProducts 中选择的 POST/Edit 操作选择。

问题是当用户输入无效时 - 我需要重新显示页面而不接触输入的用户数据,同时仍然提供 AvailableProducts。只需 返回查看(数据)将不起作用,因为 AvailableProducts 不是提交数据的一部分并且为空。

问题是:我该如何解决这个问题?我可以
public ActionResult(ViewModel data)
{
if (!ModelState.IsValid)
{
data.AvailableProducts = repository.GetAvailable();
return View(data);
}
}

但它有点冗长,而且容易出错,因为提交哪些属性以及要重新设置哪些属性并不明显。有没有更好的办法?

例如,我可以让 ViewModel 自己获取数据(例如使用 ServiceLocator),但这并不好,因为 Controller 应该准备数据。

最佳答案

我不知道有更好的方法来做到这一点,尽管您可能希望将其重构为一个可以被两个操作重用的单独方法。

private ViewModel PopulateModelForView( Order order, string[] products )
{
return new ViewModel
{
Order = order,
SelectedProducts = products ?? new string[],
AvailableProducts = repository.GetAvailable()
};
}

public ActionResult Edit(Order order)
{
return View( PopulateModelForView( order, null) );
}

public ActionResult Update(ViewModel data)
{
if (!ModelState.IsValid)
{
return View( PopulateModelForView( data.Order, data.SelectedProducts ) );
}
}

关于asp.net-mvc - ASP.NET MVC : using same ViewModel for rendering page and getting results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1729518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com