ASP。 Net MVC和RegisterClientScriptBlock替代方案

时间:2010-04-04 20:56:25

标签: asp.net-mvc asp.net-mvc-2

我目前有一个调用RegisterClientScriptBlock的Web表单aspx页面。这会发送我用于客户端验证的消息文本,例如

    <script type="text/javascript">
    //<![CDATA[
    var c_errorMessages = {
        RequiredField : "* Mandatory field"
    };
    //]]>
    </script>

根据区域性和资源文件在服务器端生成值。 我相信你不能将RegisterClientScriptBlock与MVC一起使用。 关于如何用MVC实现这一点的任何想法?

4 个答案:

答案 0 :(得分:1)

使用客户端验证时,validation that comes with ASP.NET MVC 2内置了对本地化验证消息的支持。这将负责注册客户端脚本。

话虽如此,在ASP.NET MVC中执行此操作的最常见方法可能是让控制器使用呈现客户端脚本所需的数据来提供视图。这方面的一个例子是

控制器中的动作方法:

ViewData["MessagesToClient"] = new[] { "Abandon", "All", "Hope" };
return View("MyView");

MyView.aspx中的一些代码:

<%= RenderPartial("MyPartialView") %>

MyPartialView.ascx中的一些代码:

<script>
<% foreach (var message in (IEnumerable<string>)ViewData["MessagesToClient"]) { %>
  alert("<%= message %>");
<% } %>
</script>

这样,MyView.aspx不一定需要了解MyPartialView.ascx数据的所需数据。

答案 1 :(得分:1)

为HtmlHelper创建一个扩展方法,它接受你的模型并呈现javascript。

如果您正在进行验证:

查看Castle Validation属性。 http://castleproject.org。 您可以向模型添加属性(类)...

[ValidateNonEmpty]
public string Name { get; set; }

并且你的扩展方法可以确定它们的存在并编写适当的javascript / jquery。

public static string JSValidation<T>(this HtmlHelper<T> html, T model) where T : class {}

在您的视图中使用帮助程序:

<%= Html.JSValidation(Model) %>

ASP.NET MVC in Action在第13章中有一个很好的例子。

答案 2 :(得分:0)

感谢您回答bzlm。除了我没有使用用户控件之外,我的解决方案与您的解决方案几乎相同 在我的控制器中,我添加到viewdata(这将从方法生成):

ViewData["javascriptBlockRequired"] =
    "\r\n<script type='text/javascript'>\r\n//<![CDATA[\r\nvar c_merchant = { \r\n\tSomeField: false};\r\nvar c_errorMessages = {\r\n\tRequiredField : '* Required' \r\n};\r\n//]]>\r\n</script>\r\n";

在我的视图中,我在正文的开头输出脚本:

<body>
<%= ViewData["javascriptBlockRequired"] %>
....
<body/>

答案 3 :(得分:0)

1-添加扩展方法类

public static class Extentions
{
    public static void AddRegisterClientsSript(this HtmlHelper helper, string key, string script)
    {
        Dictionary<string, string> scripts;
        if (helper.ViewBag.RegisterClientsSript != null)
        {
            scripts = (Dictionary<string, string>)helper.ViewBag.RegisterClientsSript;
        }
        else
        {
            scripts = new Dictionary<string, string>();
            helper.ViewBag.RegisterClientsSript = scripts;
        }

        if (!scripts.ContainsKey(key))
        {
            scripts.Add(key, script);
        }

    }

    public static MvcHtmlString RegisterClientsSript(this HtmlHelper helper)
    {
        var outScripts = new StringBuilder();

        if (helper.ViewBag.RegisterClientsSript != null)
        {
            var scripts = (Dictionary<string, string>)helper.ViewBag.RegisterClientsSript;
            foreach (string script in scripts.Values)
            {
                outScripts.AppendLine(script);
            }
        }

        return MvcHtmlString.Create(outScripts.ToString());
    }

    public static MvcHtmlString Paging(this HtmlHelper helper, string uniqId)
    {
        helper.AddRegisterClientsSript("jquerypaginatecss", @"<link href=""/Content/Paginate/jquery.paginate.css"" rel=""stylesheet"" />");
        helper.AddRegisterClientsSript("jquerypaginatejs", @"<script src=""/Content/Paginate/jquery.paginate.js""></script>");
    }
}

2-在页面中添加命名空间并使用它

@using Mirak.Ui.Components

@section scripts{
   @Html.RegisterClientsSript()
}