【问题标题】:Is there a "standard MVC" way of mixing Javascript and Razor?是否有混合 Javascript 和 Razor 的“标准 MVC”方式?
【发布时间】:2014-08-22 11:09:39
【问题描述】:

我真的不喜欢页面加载,我认为它们有损用户体验,所以我试图让我的 Web 应用程序高度 AJAX 化。

当用户点击“Add new”时,Javascript 会根据使用 Razor 的模型生成一个表单,代码如下:

<script type="text/javascript">

    var strNewCategoryForm = '<div><i class="glyphicon glyphicon-folder-open rightfolderpadding"></i>@using (Html.BeginForm("AddCategory", "Password", FormMethod.Post, new { @class="newcategoryform", role = "form", id="[1]" })) { @Html.AntiForgeryToken() @Html.PasswordFor(m => m.Category_ParentID, new { type = "hidden", value = "0" }) @Html.PasswordFor(m => m.CategoryName, new { type = "text" })  <span class="btn-group groupalign"><a href="#" onclick="saveNewCategory(\'#[2]\');return false;" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-save"></i>Save</a></span> }</div>';

</script>

代码运行良好,Razor 能够在字符串中生成表单,所以我对这项工作没有任何问题。 但是,对于代码的可读性和易于开发而言,它并不是那么好。

我对 MVC 和 razor 还是很陌生,所以我只是想知道,有没有更好的或“MVC/Razor 标准”的方式来做这件事,我不知道?

编辑: 如果有人感兴趣,我已经使用了 Exception 的两个答案:

在局部视图中:

@model Secure_Password_Repository.Models.Category

<div><i class="glyphicon glyphicon-folder-open rightfolderpadding"></i> \
    @using (Ajax.BeginForm("AddCategory", "Password", new AjaxOptions { HttpMethod="post", OnFailure="" }, new { @class="newcategoryform", role = "form", id="[1]" })) 
    { 
    @: \
    @Html.AntiForgeryToken() @: \
    @Html.HiddenFor(m => m.Category_ParentID, new { value = "0" }) @: \
    @Html.TextBoxFor(m => m.CategoryName) @: \
    @: <span class="btn-group groupalign"><a href="#" onclick="saveNewCategory(\'#[2]\');return false;" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-save"></i>Save</a></span>  \
    }</div>

在主视图中:

<script type="text/javascript">

    var strNewCategoryForm = '@Html.Partial("_NewCategoryForm")';

</script>

局部视图中每行末尾的“\”告诉 JavaScript 每行是一个字符串值的延续。

【问题讨论】:

  • "我真的不喜欢页面加载" 这看起来很笼统。你到底是什么意思?您是否遇到过最初需要几秒钟才能加载的网页?
  • 考虑使用 jQuery 返回部分视图。至于使用@Ajax 方法,请看SO问答hereherehere

标签: c# javascript asp.net-mvc razor


【解决方案1】:

答案 1:-

如果您非常热衷于 AJAX 化您的 Web 应用程序,那么更好的方法是在 Asp.MVC 中使用 Ajax 助手,例如

@Ajax.BeginForm()@Ajax.ActionLink() 以及像 @Html.Partial() 这样的助手,

@Html.RenderPartial() 等也很方便异步加载数据。

他们的基本用法(我在这里举个假设的例子):-

@Ajax.ActionLink("Show", 
                 "Show", 
                  null, 
                  new AjaxOptions { HttpMethod = "GET", 
                  InsertionMode = InsertionMode.Replace, 
                  UpdateTargetId = "dialog_window_id", 
                  OnComplete = "your_js_function();" })

@using (Ajax.BeginForm("Edit", "Cars", new AjaxOptions
{
    InsertionMode = InsertionMode.Replace, 
    HttpMethod = "POST",
    OnSuccess = "updateSuccess"
}, new { @id = "updateCarForm" })) { ..... } 

点击此链接:- http://www.codeguru.com/csharp/.net/working-with-ajax-helper-in-asp.net-mvc.htm

以上链接将有助于您了解使用 Ajax Helpers 构建表单。

还有一件事,“在我看来”,您在 javascript 中使用 razor 语法构建表单的方式根本不是一个好的选择。


答案 2:-

一个小演示如何构建一个不需要任何页面重新加载的完全 ajax 化的表单:

 @using (Ajax.BeginForm("Index", "Home", null, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "Mydiv" }, new { @id = "frm" , @style ="width:700px" }))
 { 
  //Your HTML here
 }

使上面的视图成为一个局部视图,说'Index.cshtml',然后通过控制器以这种方式返回它:

Public ActionResult Index()
{
  return PartialView("Index");
}

通过 Jquery 制作局部视图和加载局部视图对于制作不显眼的表单很方便。

【讨论】:

  • 很好,这正是我所说的。我会试一试,它有效,我会把它作为正确答案。
  • 不幸的是,这实际上并没有帮助。我想就像 manuFS 说的那样,它更像是一个 HTML 的东西......虽然这很棒,我会使用它 - 我想做的事情是在单击按钮时显示一个表单,而不是制作形成 Ajax 化(已经完成)。
  • @binks...请参阅更新的答案..此外,下面的代码会产生动态数据问题..
  • 谢谢,这一切帮助很大。在每行末尾添加“\”意味着我可以使剃须刀代码看起来不错(在多行上)并且仍然将其存储在 JS 变量中。
【解决方案2】:

这比 MVC/Razor 更像是 HTML 的东西,因为您本质上是在询问如何将模板嵌入到您的网站中。 AFAIK html 尚不支持开箱即用的模板,因此您需要一些 JavaScript(在您现在的情况下,您可能正在使用 jquery)

大部分模板引擎,如 knockoutjs、handlebars 等(甚至可能是 jquery)都支持嵌入类似这样的模板:

<script type="text/html" id="my_template">
    <div>
        <p>
            My template
        </p>
    </div>
</script>

浏览器不会呈现该 html,但 JavaScript 库会使用它(可选地进行一些运行时数据绑定)并显示它。

注意:您显然可以将该模板中的 html 放入部分视图中:

_MyTemplate.cshtml:

    <div>
        <p>
            My template
        </p>
    </div>

查看:

<script type="text/html" id="my_template">
    @Html.Partial("MyTemplate")
</script>

大多数模板引擎还支持异步加载模板,在这种情况下,您只需将它们单独渲染为部分视图。

希望这会有所帮助。

【讨论】:

  • 嗯...有趣,我还没有通过使用局部视图,我会试一试。
  • 谢谢,这个答案是正确的,但是由于 Exception 也写过这个和 Ajax.Beginform(),这两者都对我有帮助,所以我将他的答案标记为正确的答案。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多