我对使用问题的“最佳实践”控制器感到有点困惑。
我的典型代码看起来
public ActionResult Edit(int reportId,FormCollection formCollection)
{
try
{
var report = _dbContext.EmployeeReports.Find(reportId);
if (TryUpdateModel(report))
{
_employeeReportService.Update(report);
return RedirectToAction("List");
}
return View("Edit", report);
}
catch (Exception)
{
// some logging etc
return RedirectToAction("List");
}
嗯,最好使用“TryUpdateModel”或仅使用“UpdateModel”或简单调用Model.IsValid并且最好在控制器中捕获异常?
谢谢
答案 0 :(得分:5)
这是我更喜欢的替代方式:
[HttpPost]
public ActionResult Edit(ReportViewModel reportViewModel)
{
if (!ModelState.IsValid)
{
// there were validation errors => redisplay the form
// so that the user can fix them
return View(reportViewModel);
}
// At this stage the view model is valid => we can
// map it back to a domain model and pass to the repository
// for processing
// Fetch the domain model that we want to update
var report = _repository.Get(reportViewModel.Id);
// map the domain model properties from the view model properties
// in this example I use AutoMapper
Mapper.Map<ReportViewModel, Report>(reportViewModel, report);
// perform update
_repository.Update(report);
// the update wen fine => we can redirect back to the list action
return RedirectToAction("List");
}
因此,您看不到FormCollection
,没有TryUpdateModel
,没有UpdateModel
,没有try/catch
。
答案 1 :(得分:0)
这取决于您是否期望并计划处理异常。
我通常的做法是:
public ActionResult foobar(FormCollection formCollection)
{
//Keep this out of the try catch scope in case you need to pass it
// to the next method.
Model model = new Model();
try
{
if(!TryUpdateModel(model)
{
//Update Failed so fix it and redirect
return redirectToAction("fixit");
}
if(!ModelState.IsValid())
{
//Update worked but model state was invalid, return to page to correct
//model validation errors
return View("foobar", model);
}
//Update Succeeded so do other stuff
}
catch(Exception ex)
{
//Deal with Exception
return redirectToAction("ErrorView", "ErrorController");
}
return redirectToAction("NextStep");
}
我尝试在我的代码中使用它们来尝试捕获每个问题,然后再破坏它。
答案 2 :(得分:0)
在我看来,你应该总是使用视图模型而不是formcollection来避免发布不足和过度发布问题。因此,在我看来,最好的做法是使用视图模型来渲染视图,以及一种post / get模型,它与用户希望用户发布/从动作中获取的内容完全绑定。
这可能是一些额外的工作,一些视图模型看起来非常类似于您在控制器操作中用于绑定的模型,但我会说“安全性超过便利性。”