我正在开发一个处理表单/文档的 Controller ,我在任务中进展得越多,我在方法中看到的代码重复部分就越多。无论是否是 mvc,这都是我的第一个 ASP
应用程序,我不确定优化代码的最佳方法是什么。我注意到的事情 - 重复多次的模式是这样的:
public ActionResult DisplayForm(int? documentId, long status)
{
ViewBag.Status = status;
List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldService.GetFieldsForDocument(documentId);
var finalModel = model
.OrderBy(c => c.ContentTypeId)
.ThenBy(c => c.RowNo)
.ThenBy(c => c.ColumnNo)
.ThenBy(c => c.MCS_Fields.Order)
.ToList();
return View(finalModel);
}
这是一种显示某种形式的方法。但是当表单被编辑时,我用另一种方法处理这个:
public ActionResult UpdateDocument(List<MCS_DocumentFields> collection)
{
//TODO deal with the repeating code
int? documentId = (int)collection[0].MCS_Documents.Id;
ViewBag.Status = 1;
List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldService.GetFieldsForDocument(documentId);
var finalModel = model
.OrderBy(c => c.ContentTypeId)
.ThenBy(c => c.RowNo)
.ThenBy(c => c.ColumnNo)
.ThenBy(c => c.MCS_Fields.Order)
.ToList();
//var ts = collection;
return View("DisplayForm", finalModel);
}
我必须实现数据验证和更新的逻辑,但最后我想显示相同的 View - 带有新数据的编辑过的表单和一些正确的消息,比如“保存成功”或类似的东西。
所以我想知道我可以在这里做什么 - 在我的 Controller 中编写一些私有(private)方法,我会在需要的地方调用它们。也许有一种方法可以......如示例中所示 - 处理
UpdateDocument
方法中的保存,然后 UpdateDocument
返回 DisplayForm
方法..我不确定。 最佳答案
您可以通过调用 DisplayForm 方法返回,如下所示:
public ActionResult UpdateDocument(List<MCS_DocumentFields> collection)
{
//TODO deal with the repeating code
int? documentId = (int)collection[0].MCS_Documents.Id;
long status = 1;
List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldService.GetFieldsForDocument(documentId);
return DisplayForm(documentId, status);
}
在 DisplayForm 中,您应该指定要呈现的 View 的名称,更改
return View(finalModel);
和
return View("DisplayForm", finalModel);
附录
您应该查看 Post-Redirect-Get 或 PRG 模式:http://en.wikipedia.org/wiki/Post/Redirect/Get
在遵循该模式时,您可以改为在 UpdateDocument 方法的末尾返回一个到 DisplayForm 的重定向。
return RedirectToAction("DisplayForm", new{ documentId, status });
关于c# - 处理 asp.net mvc 3 Controller 中的重复代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16771930/