ASP.NET MVC 1与MVC 3中的CRUD操作

3

我正在www.asp.net上进行[这个教程][1]。它是为ASP.NET MVC 1编写的。虽然大部分内容适用于MVC 3,但我有一个关于以下代码的问题:

ASP.NET MVC 1.0(直接来自教程)

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "Id")] Contact contactToCreate)
{
    if (!ModelState.IsValid)
        return View();

    try
    {
        _entities.AddToContactSet(contactToCreate);
        _entities.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

ASP.NET MVC 3(除了我的_entities对象外,MVC 3项目生成的默认创建操作)

[HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                _entities.AddToContacts(collection); // synax error
                _entities.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

所以我的问题是为什么在第一个案例中我们传递了Contact contactToCreate,而在第二个案例中传递了FormCollection collection
我可以轻易地将第二个案例的参数更改为只需Contact Contact contactToCreate,但我很想知道这个FormCollection collection是什么?为什么MVC 3为我们生成它?如果可以使用FormCollection,那么修改后的示例会是什么样子?
[1]: http://www.asp.net/mvc/tutorials/iteration-1-create-the-application-cs

1
这似乎是一步倒退...我猜你仍然可以使用强类型版本,如果你想的话。 - Robert Harvey
3个回答

2

个人而言,我建议你继续使用MVC1的示例--没有必要回到松散的键值集合领域。


2
您不应该使用FormCollection。微软的这篇优秀教程解释了您应该更改创建的签名以使用您的模型。它使用FormCollection的原因是在生成脚手架代码时未指定模型。希望这可以帮助您。
第二个Create方法更有趣。当Create视图回传时,将调用此方法。默认情况下,模板告诉此Create方法期望将FormCollection作为参数传递进来。
由于Create视图是作为强类型视图创建的,因此它将能够返回一个强类型的Blog对象。这意味着您可以更改该签名,使该方法接收一个Blog类型。这将简化将新博客添加到BlogModelContainer并使用Entity Framework代码将其保存回数据库的任务。

1

FormCollection 是用户输入的值,而 Contact 是您要创建的基础实体。

请记住,该方法实际上是由用户直接调用作为 HTTP 提交的结果,并且不加验证地盲目接受用户输入是不好的做法。这个事实以及在真实场景中,HTTP 提交请求中可用的值与数据实体属性并不完全匹配的事实,这可能是接受 FormCollection(或其他代表您的表单值的抽象输入)而不是直接接受数据库中的实体的好主意。

就我个人而言,我修改后的示例看起来会像这样:

[HttpPost]
public ActionResult Create(FormCollection collection)
{
    try
    {
        var contactToCreate = validateAndCreateContact(collection);
        if (contactToCreate != null)
        {
            _entities.AddToContacts(collection);
            _entities.SaveChanges();
            return RedirectToAction("Index");
        }
    }
    catch (Exception ex)
    {
        // Logic to display error on the view goes here, e.g.
        base.ViewData["Exception"] = ex;
    }
    return View();
}

private Contact validateAndCreateContact(FormCollection collection)
{
    // Your implementation here
}

如果用户输入都正确无误,validateAndCreateContact函数将验证用户输入并返回一个合适的Contact对象。如果不正确,则应返回null并处理向用户显示适当错误(例如通过在ViewData上设置属性)。


2
(吹毛求疵),不要使用ViewData来保存错误信息。在返回视图之前,请使用ModelState.AddError - RPM1984

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接