asp.net-mvc – TryUpdateModel的实例,ASP .NET MVC 3

我不明白,如何使用TryUpdateModel和保存MVC架构在同一时间。

如果我没有误,使用数据报文必须在模型中。所以,这样的代码

var db=new TestEverybody();//it is class,which was generated by EntityFramework 
var currentTesting=db.Testing.(t => t.id == id).First();

必须位于模型中,不能在控制器中,不能吗?

但TryUpdateModel的用法的例子如下:

public ActionResult Edit(Testing obj)//Testing collection
    {
        var db = new TestEverybody();
        var currentTesting=db.Testing.(t => t.id == obj.id).First();
        TryUpdateModel(currentTesting);
        db.SaveChanges();            
        return RedirectToAction("Index");
    }

这不会打破MVC架构吗?我们在控制器中使用数据库,而不是在特殊的Model类中。

那么,什么是在一个真正的项目中使用TryUpdateModel的最好的方法

解决方法

自从OP问以来,这里有一个viewmodel模式的例子,或者我喜欢调用它 – ASP.NET MVC正常完成。

所以为什么要使用视图特定的模型

>您应该只将信息传递给您需要的视图。
>通常,您需要添加其他视图元数据(如标题/描述属性)。这些不属于您的实体。
>使用TryUpdateModel / UpdateModel是错误的。不要使用(我会解释为什么)。
>很少,你的视图模型将完全匹配你的实体。人们通常最终只是使用ViewBag而不是强类型的视图模型属性来向他们的实体添加额外的碎片(或者更好)。
>如果你使用ORM,你可以遇到延迟加载属性的问题(N 1)。您的视图不应该发出查询

我们将从一个简单的实体开始:

public class Product {
    public int Id {get;set;}
    public string Name {get;set;}
    public string Description {get;set;}
    public decimal Price {get;set;}
}

让我们假设你有一个简单的表单,用户只能更新产品的名称和描述。但你使用(非常贪婪)TryUpdateModel。

所以我使用任何数量的工具(如fiddler)自己构造一个POST并发送以下内容

Name=WhatverIWant&Description=UnluckyFool&Price=0

ASP.NET MVC模型绑定器将检查输入表单集合,看到这些属性存在于您的实体,并自动绑定为您。因此,当您刚刚从数据库中检索的实体上调用“TryUpdateModel”时,所有匹配的属性都将更新(包括Price!)。新选项的时间。

查看特定模型

public class EditProductviewmodel {
    [HiddenInput]
    public Guid Id {get;set;}

    [required]
    [displayName("Product Name")]
    public string Name {get;set;}

    [AllowHtml]
    [DataType(DataType.MultilineText)]
    public string Description {get;set;}
}

这只包含我们需要的属性。注意,我们还添加了一些验证属性显示属性和一些mvc特定属性

通过不受我们在我们的视图模型中的限制,它可以使您的视图更清洁。例如,我们可以通过在我们的视图中显示以下内容来呈现整个编辑表单:

@Html.EditorFor(model => model)

Mvc将检查我们添加到视图模型中的所有属性,并自动连接验证,标签和正确的输入字段(即文本区域以供说明)。

发布表单

[HttpPost]
public ActionResult EditProduct(EditProductviewmodel model) {

    var product = repository.GetById(model.Id);

    if (product == null) {
        return HttpNotFound();
    }

    // input validation
    if (ModelState.IsValid) {

        // map the properties we **actually** want to update
        product.Name = model.Name;
        product.Description = model.Description;

        repository.Save(product);

        return RedirectToAction("index");
    }

    return View(model)
}

从这个代码它是很明显的它做什么。当我们更新实体时,我们没有任何不良影响,因为我们在我们的实体上显式设置属性

我希望这解释了View-Model模式足以让你使用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WPF...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
Some samples are below for ASP.Net web form controls:(from http://www.visualize.uk.com/resources/asp
问题描述: 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。 For columns not defined as System.String, the only vali
最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence changed a lot since 1.1. Here is the order: App
静态声明: ' Style="position: relative" AppendDataBoundItems="True"> (无 或 空 或
以下内容是从网络上搜集资料,然后整理而来的。不当之处,请不吝指教。(The following were from network, and edited by myself. Thanks in a
Imports System Imports System.Reflection Namespace DotNetNuke '*********************************
Ok so you have all seen them: “8 million tools for web development”, “5 gagillion tools that if you
以下内容来源于: http://blog.csdn.net/cuike519/archive/2005/09/27/490316.aspx 问:为什么Session在有些机器上偶尔会丢失? 答:可能和
以下文章提到可以用“http://localhost/MyWebApp/WebAdmin.axd”管理站点: ---------------------------------------------
Visual Studio 2005 IDE相关的11个提高开发效率的技巧 英文原创来源于: http://www.chinhdo.com/chinh/blog/20070920/top-11-vis
C#日期格式化 from: http://51xingfu.blog.51cto.com/219185/46222 日期转化一 为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007
from: http://www.nikhilk.net/UpdateControls.aspx Two controls that go along with the UpdatePanel and
Open the report in the Designer. In the ToolBox, select/expand the "Report Items" section.
from: http://drupal.org/node/75844 Do this: find which TinyMCE theme you are using. For the sake of
asp.net中给用户控件添加自定义事件 用户控件中定义好代理和事件: public delegate void ItemSavedDelegate(object sender, EventArgs
在Windows版本的Safari中浏览以下的页面。 http://www.asp.net/AJAX/Control-Toolkit/Live/Calendar/Calendar.aspx Calen
http://aspnet.4guysfromrolla.com/articles/021506-1.aspx By Scott Mitchell Introduction When creating