如何处理 MVC 视图中的"magic strings",例如元素 id:s?



在我的MVC视图中,我经常需要引用JavaScript中的各种元素,为此,我定义了这些元素的id属性。这通常与更新各种容器元素内容的Ajax调用结合使用。

一个简短的例子(Razor):

<table id="PersonList">
...
</table>
<div id="PersonDetails">
<!-- This would be loaded dynamically using Ajax -->
<input type="hidden" name="CurrentPersonId" value="@Model.PersonId">
...
</div>

它包含三个"魔术字符串":"PersonList"、"PersonDetails"one_answers"CurrentPersonId"。Ajax调用可能如下所示:

$('#PersonDetails').load('@Url.Action("GetPersonDetails")', { PersonId: ... });

神奇的字符串"PersonDetails"再次出现。

不好!

有人能提出一些"最佳实践",在一个地方定义这些magics字符串,并在1)视图、2)最好是实现Ajax调用的静态JavaScript文件和3)CSS文件中使用它们吗?

我想,也许_Layout.cshtml可以包括一个局部视图,该视图定义该控制器甚至特定操作的魔术串。它将检查是什么控制器和/或操作调用它,并在此基础上调用适当的局部视图。我已经为.css和static.js做了类似的事情,让我简单地添加Person.css,并将其自动包含在Person控制器的所有视图中。

局部视图的作用如下:

@{
const string PersonListId = "PersonList";
const string PersonDetailsId = "PersonDetails";
const string CurrentPersonIdName = "CurrentPersonId";
}
<script type="text/javascript">
NamesAndIds = {};
NamesAndIds.PersonListId = '@Html.Raw(PersonListId)';
NamesAndIds.PersonDetailsId = '@Html.Raw(PersonDetailsId)';
NamesAndIds.CurrentPersonIdName = '@Html.Raw(CurrentPersonIdName)';
</script>

这应该让Razor代码使用C#字符串常量来生成适当的HTML,并且静态JavaScript文件可以在jQuery选择器等中引用NamesAndId。。。如何在.css文件中使用它们我不知道。

有什么更好的建议吗?你是如何处理这个问题的?

我希望有人能想出更好的东西,但这至少是一些东西。

在主(非部分)视图中,我在顶部有一个部分定义了我需要在C#、HTML和JavaScript:中的多个位置使用的id和名称

@{
const string PersonListId = "PersonList";
const string PersonDetailsId = "PersonDetails";
const string CurrentPersonIdName = "CurrentPersonId";
}

在底部,我有一个脚本部分,它将字符串分配给合适的命名空间容器对象:

<script type="text/javascript">
MyNamespace = {};
MyNamespace.Ids = {};
MyNamespace.Names = {};
MyNamespace.Ids.PersonList = '@Html.Raw(PersonListId)';
MyNamespace.Ids.PersonDetails = '@Html.Raw(PersonDetailsId)';
MyNamespace.Names.CurrentPersonId = '@Html.Raw(CurrentPersonIdName)';
</script>

在每个引入需要通过id或名称引用的附加项的局部视图中,我添加了类似的代码,用所需的字符串扩展MyNamespace.IdsMyNamespace.Names

现在,我可以使用Razor视图代码中的C#字符串常量来生成具有正确id和名称的标记,并且我可以编写引用MyNamespace.IdsMyNamespace.Names的常规静态JavaScript文件来查找正确的id和名称,例如在jQuery选择器中。

我还为Ajax调用使用的操作URL添加了类似的内容,并将它们放在MyNamespace.Urls:中

MyNamespace.Urls.GetPerson = '@Html.Raw(Url.Action("GetPerson"))';

这并不理想,但它很简单,解决了分散在各处的魔术串这一最紧迫的问题。它在编译时不会检测到错误,但重命名项目需要在一个地方重命名一个字符串,如果我重命名或拼写错MyNamespace.Ids.Something,它至少会生成一个运行时JavaScript错误,可以在JS控制台或类似控制台中看到。

对于操作和文件名(js,css),请使用T4MVC。

T4MVC是ASP.NET MVC应用程序的T4模板类型化的帮助程序,它消除了在许多地方。

我不会担心id和css类名。

尝试定义自定义路由

PeopleLists/{PeopleList}/Person/{PersonID}

然后你的URL看起来像这个

http://www.mysite.com/PeopleLists/Friends/Person/Pete