我正在阅读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个问题。感谢
答案 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