将ViewUserControl上的属性绑定到.NET MVC 2中的本地变量

时间:2011-03-13 18:05:44

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

我想做类似这样的事情,其中​​item是.aspx页面中的局部变量:

<p:ProgressBar  runat="server" Progress="<%#item.Completed/item.Total%>" Width="100" />

绑定表达式未检测到本地页面级别变量。有没有办法可以使用RenderPartial完成 wihtout

2 个答案:

答案 0 :(得分:1)

您不应在ASP.NET MVC应用程序中使用任何服务器端控件(runat="server"),因为它们依赖于ASP.NET MVC中不再存在的ViewState和PostBack。唯一的例外是使webforms视图引擎使用<asp:Content>面板来实现母版页。也没有绑定的概念。

在ASP.NET MVC中,您有一个模型,一个控制器和一个视图。控制器填充一些模型并将其传递给要显示的视图。视图本身可以使用HTML helpers生成简单标记,或者包含其他部分视图以用于更复杂的场景。

所以你开始定义一个模型:

public class MyViewModel
{
    public double Progress { get; set; }
}

然后你有一个操纵这个视图模型的控制器:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        var completed = 5; // get this from somewhere
        var total = 10; // get this from somewhere
        var model = new MyViewModel
        {
            Progress = (1.0 * completed / total)
        }
        return View(model);
    }
}

最后你会得到一个强类型视图来显示标记:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<AppName.Models.MyViewModel>" 
%>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Progress</h2>
    <div><%= Html.DisplayFor(x = x.Progress)</div>
</asp:Content>

答案 1 :(得分:0)

答案是,确实没有一个好方法可以做到这一点。您可以使用ViewDataKey属性传递模型,但是您仍然使用当前ViewDictionary中存在的键,因此您将通过此路径向父视图添加一些残差。

如果您想设置仅查看属性,可以使用自定义HTML帮助程序,但最好不要尝试查找Darin提到的解决方法。