关于EditorTemplates用法ASP.Net MVC的代码

时间:2015-09-02 10:55:10

标签: asp.net-mvc

我正在阅读EditorTemplates

上的帖子

来自此网址http://stackoverflow.com/questions/4872192/checkboxlist-in-mvc3-0

看到他们的代码之后,我只是不明白它的工作方式

查看模型:

public class MyViewModel
{
    public int Id { get; set; }
    public bool IsChecked { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new[] 
        {
            new MyViewModel { Id = 1, IsChecked = false },
            new MyViewModel { Id = 2, IsChecked = true },
            new MyViewModel { Id = 3, IsChecked = false },
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<MyViewModel> model)
    {
        // TODO: Handle the user selection here
        ...
    }
}

视图

(

~/Views/Home/Index.cshtml

):

@model IEnumerable<AppName.Models.MyViewModel>
@{
    ViewBag.Title = "Home Page";
}
@using (Html.BeginForm())
{
    @Html.EditorForModel()
    <input type="submit" value="OK" />
}

和相应的编辑器模板

(

~/Views/Home/EditorTemplates/MyViewModel.cshtml

):

@model AppName.Models.MyViewModel
@Html.HiddenFor(x => x.Id)           
@Html.CheckBoxFor(x => x.IsChecked)

请参阅此代码

@using (Html.BeginForm())
{
    @Html.EditorForModel()
    <input type="submit" value="OK" />
}

1)这条线将做什么

@Html.EditorForModel() ?

2)如果此行加载名为

的视图

来自此位置的MyViewModel

/Views/Home/EditorTemplates/MyViewModel.cshtml

3)那么mvc引擎如何理解它必须加载名为

的视图 来自此位置的{p> MyViewModel /Views/Home/EditorTemplates/

4)我看到人们总是创造

EditorTemplates
共享视图中的

文件夹,但在这种情况下,它是在主文件夹中创建的......为什么?

5)如果这个位置有太多其他视图,那么该行

@Html.EditorForModel()

会加载此特定视图

MyViewModel.cshtml

从这个位置

/Views/Home/EditorTemplates.

我是mvc和学习的新手。那么请帮助我理解上面的代码是如何工作的?

也请回答我的5个问题。感谢

1 个答案:

答案 0 :(得分:1)

在回答您的具体问题之前,您必须知道asp .net mvc在很大程度上依赖于约定优于配置。

  

1)这条线将做什么

     

@ Html.EditorForModel()?

它只是告诉视图将模型作为一个整体传递给EditorFor。

  

2)如果此行加载名为

的视图      

来自此位置的MyViewModel

     

/Views/Home/EditorTemplates/MyViewModel.cshtml 3)那么mvc引擎如何   会明白它必须加载名为

的视图      

来自此位置的MyViewModel / Views / Home / EditorTemplates /

Mvc按惯例了解它。它将查看视图,查看与viewModel类型相同的模板(在本例中为MyViewModel)

模式mvc看是:

视图{控制器} \ EditorTemplates \ MyViewModel.cshtml 视图\共享\ EditorTemplates \ MyViewModel.cshtml

如果它找到它,它将停止寻找。因此,即使共享中存在一个视图,也将使用Controller中的视图。

  

4)我看到人们总是创造

     

EditorTemplates共享视图中的文件夹,但在这种情况下会创建它   在主文件夹.....为什么?

如果它在Shared中,则表示具有相同ViweModel类型名称的任何其他控制器MyViewModel可以使用相同的视图。如果它在家中,这意味着它仅适用于“Home”控制器特定。

  

5)如果这个位置有太多其他视图,那么该行

     

@ Html.EditorForModel()将加载此特定视图

     

此位置的MyViewModel.cshtml

     

/查看/主页/ EditorTemplates。我是mvc和学习的新手。所以,请   帮助我理解上面的代码是如何工作的?

这就是惯例,正如我上面回答的那样,mvc看起来有一定的模式,第一个匹配得到应用。

修改

感谢Stephen Muecke指出,我输入的速度太快了。 视图的搜索模式是:

视图{控制器} \ EditorTemplates \ MyViewModel.cshtml 视图\共享\ EditorTemplates \ MyViewModel.cshtml

所以,如果它找到它,它将停止寻找。这意味着如果它在当前控制器中找到(在您的示例中为Home),则它会停止查找。只有在控制器特定文件夹中找不到它时,它才会继续显示。

编辑2 - 包含使用编辑模板的一些理由

编写编辑器/显示模板的原因是代码重用。

考虑在datetime属性上使用jquery datepicker。

如果您不使用编辑器模板,那么您将在视图中复制代码以使用jquery datepicker。

如果您使用编辑器模板,那么如果有一天您想将jquery datepicker更改为其他插件,则只需更改编辑器模板,而不是其他地方。因此,不要重复自己(DRY)校长。 当显示相同类型的输入时,这也会在多个页面上保持相同的ui一致性。

我上面给出的示例是在一个属性上,但如果模板是针对整个模型的,那么这就是EditorForModel的用武之地,但同样的想法。

考虑一下这篇关于模板

的一些用法的文章

https://www.simple-talk.com/dotnet/asp.net/extending-editor-templates-for-asp.net-mvc/

以下是为asp .net mvc 2编写的模板的更深入细节。但同样适用于mvc 4和5

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html