我在看EditorTemplates上的一篇文章
从这个url 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.cshtml3)那么mvc引擎将如何理解它必须加载名为
MyViewModel从这个位置/Views/Home/EditorTemplates/
4)我看到人们总是创造
EditorTemplates共享视图中的文件夹,但在这种情况下,它是在主folder.....why中创建的?
5)如果这个位置有这么多其他视图,那么这一行是如何
@Html.EditorForModel()将加载此特定视图。
MyViewModel.cshtml从这个地方
/Views/Home/EditorTemplates.我是mvc和学习方面的新手。所以请帮助我理解上面的代码是如何工作的?
也请回答我的五个问题。谢谢
发布于 2015-09-02 11:05:45
在回答您的具体问题之前,您必须知道asp .net mvc对约定的影响很大,而不是配置。
1)这一行将做什么 @Html.EditorForModel()?
它只是告诉视图将模型作为一个整体传递给EditorFor。
2)如果这一行将加载一个名为 来自这个位置的MyViewModel /Views/Home/EditorTemplates/MyViewModel.cshtml 3)那么mvc引擎将如何理解它必须加载名为 MyViewModel从这个位置/视图/主页/编辑模板/
Mvc按照惯例知道这一点。它将查看与viewModel类型相同名称的模板视图(在本例中为MyViewModel )。
mvc所看到的模式是:
Views{Controller}\EditorTemplates\MyViewModel.cshtml Views\Shared\EditorTemplates\MyViewModel.cshtml
如果它找到了,它就会停止寻找。因此,即使共享中有视图,Controller中的视图也将被使用。
4)我看到人们总是创造 EditorTemplates文件夹在共享视图中,但在这种情况下,它是在主folder.....why中创建的?
如果是共享的,这意味着任何具有相同ViweModel类型名称的MyViewModel的其他控制器都可以使用相同的视图。如果它是在家里,这意味着它是唯一可用的“家庭”控制器特定。
5)如果这个位置有这么多其他视图,那么这一行是如何 @Html.EditorForModel()将加载此特定视图 来自这个位置的MyViewModel.cshtml /视图/主页/编辑模板。我是mvc和学习方面的新手。所以请帮助我理解上面的代码是如何工作的?
这就是惯例,正如我上面回答的,有某种模式,mvc看视图,第一个匹配被应用。
编辑
谢谢Stephen指出,我打字太快了。视图的搜索模式是:
Views{Controller}\EditorTemplates\MyViewModel.cshtml Views\Shared\EditorTemplates\MyViewModel.cshtml
所以如果它找到了,它就会停止寻找。这意味着,如果在当前控制器中找到它(在您的示例中是Home),那么它将停止查找。只有在无法在控制器特定文件夹中找到它时,它才会继续查找。
编辑2-包括一些使用编辑器模板的原因
编写编辑器/显示模板的原因是为了代码重用。
考虑在datetime属性上使用。
如果不使用Editor模板,则将复制视图中的代码,以使用。
如果您使用编辑器模板,那么如果有一天您想将更改为其他插件,则只更改编辑器模板,而不更改其他地方。因此,不要后悔自己(干)校长。当显示相同类型的输入时,这也在多个页面之间保持相同的ui一致性。
上面我给出的例子是在一个属性上,但是如果一个模板是整个模型的模板,这就是EditorForModel出现的地方,但是想法是一样的。
考虑一下本文中模板的一些用法。
https://www.simple-talk.com/dotnet/asp.net/extending-editor-templates-for-asp.net-mvc/
下面是关于为asp .net mvc 2编写的模板的更深入的细节。
http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html
https://stackoverflow.com/questions/32351245
复制相似问题