3

我正在开发一个处理表单/文档的控制器,我越是推进任务,我在我的方法中看到的代码重复部分就越多。这是否是我的第一个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);

        }

我必须实现数据验证和更新的逻辑,但最后我想显示相同的视图 - 带有新数据的编辑表单和一些正确的消息,如“保存成功”或类似的东西。

所以我想知道我可以在这里做什么 - 在我的控制器中编写一些私有方法,我会在需要的地方调用它们。也许有一种方法可以...如示例中所示-处理保存UpdateDocument方法,然后UpdateDocument返回DisplayForm方法..我不确定。

4

2 回答 2

2

在不了解您的应用程序的情况下,如果可以的话,我建议您在 DocumentFieldService.GetFieldsForDocument 方法中进行排序。

如果你不能这样做,你可以这样做:

public List<MCS_DocumentFields> GetSortedFieldsForDocument(documentID)
        {

            List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldService.GetFieldsForDocument(documentId);

            var sorted = model
                .OrderBy(c => c.ContentTypeId)
                .ThenBy(c => c.RowNo)
                .ThenBy(c => c.ColumnNo)
                .ThenBy(c => c.MCS_Fields.Order)
                .ToList();

            return sorted;
        }

作为您所说的私有方法,您可以执行以下操作:

public ActionResult DisplayForm(int? documentId, long status)
        {
            ViewBag.Status = status;
            return View(GetSortedFieldsForDocument(documentId));
        }

public ActionResult UpdateDocument(List<MCS_DocumentFields> collection)
        {
            //TODO deal with the repeating code
            int? documentId = (int)collection[0].MCS_Documents.Id;
            ViewBag.Status = 1;

            return View("DisplayForm", GetSortedFieldsForDocument(documentId));

        }

在你的控制器中。

于 2013-05-27T11:29:54.443 回答
1

您可以通过调用 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 中,您应该指定要渲染的视图的名称,更改

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 });
于 2013-05-27T11:42:00.190 回答