C# 将ViewUserControl上的属性绑定到.NET MVC2中的localvariable

C# 将ViewUserControl上的属性绑定到.NET MVC2中的localvariable,c#,.net,asp.net,asp.net-mvc-2,C#,.net,Asp.net,Asp.net Mvc 2,我想执行类似的操作,其中item是.aspx页面中的一个局部变量: <p:ProgressBar runat="server" Progress="<%#item.Completed/item.Total%>" Width="100" /> 绑定表达式未检测到本地页级变量。有没有一种方法可以通过使用RenderPartial来实现这一点 您不应该在ASP.NET MVC应用程序中使用任何服务器端控件(runat=“server”),因为它们依赖于ViewState

我想执行类似的操作,其中item是.aspx页面中的一个局部变量:

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


绑定表达式未检测到本地页级变量。有没有一种方法可以通过使用RenderPartial来实现这一点

您不应该在ASP.NET MVC应用程序中使用任何服务器端控件(
runat=“server”
),因为它们依赖于ViewState和PostBack,而这是ASP.NET MVC中不再存在的概念。唯一的例外是
生成简单的标记或包含其他局部视图以用于更复杂的场景

因此,首先要定义一个模型:

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>

进展

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


如果您想设置“仅查看”属性,可以使用自定义HTML帮助程序,但最好像Darin所说的那样找到解决方法。

这并不能完全回答我的问题。我知道我可以创建强类型控件并传入模型,但我不想这样做。这是额外的代码,看起来不太好。我创建了一个带有代码隐藏的MVC控件,而不是附加一个模型,我只想用一种干净的方式将值填充到这些属性,而不需要传入一个新的模型对象。@rhooligan,ASP.NET MVC应该是这样工作的。如果您不喜欢,您仍然可以选择经典的ASP.NET WebForms,在那里您可以使用服务器控件而不会出现任何问题。我强烈建议您阅读这里的基本教程:并熟悉这个概念。再详细说明一下你对Width属性的评论,这显然是不应该的;不要成为视图模型的一部分:它应该在你的CSS文件中,然后你会给包含进度条的div分配一个类。我确实意识到我可以用CSS解决这个问题,但我确实更喜欢用视图代码来处理某些情况,而不是用视图模型。话虽如此,我认为CSS解决方案不如我想做的那么优雅和可读。@rhooligan,这可能是你从WebForms得到的反射。我第一次开始MVC时也是这样。现在我完全改变了主意:如果它是样式化的,那么它就转到CSS,这就是它们的目的。不要用样式污染你的标记。别担心,你做MVC的次数越多,你就会越习惯这种模式,你会开始发现你以前认为很好的东西,很难看的东西,反之亦然:-)为了详细说明这一点,我真的不认为像宽度这样的属性应该出现在模型中。这纯粹是视图数据,仅与视图相关。RenderPartial似乎无法在视图本身上设置属性。