开发者

MVC-3 and Dynamic - @Html.Label(View.X) not Rendering

开发者 https://www.devze.com 2023-02-14 07:12 出处:网络
Using MVC-3, Razor开发者_Go百科: -- MyController -- public ActionResult Index(String message) // where message = \"hello\"

Using MVC-3, Razor开发者_Go百科:

-- MyController --

public ActionResult Index(String message) // where message = "hello"
{
      ViewModel.Test1 = "This is a test";
      ViewModel.Test2 = "This is another test. " + message;
}

-- Index.cshtml --

@Html.Label((string)View.Test1)
<br />
@Html.Label((string)View.Test2)

Why will it only render out the following?

<label for="This is a test">This is a test</label>
<br />

It's been driving me absolutely crazy over the past few days and seems to make no sense. There has to be a reason for it.

I can debug this and step through thew view. In the view, I watch as this line is processed and the value of View.Test2 is "This is another test. hello".

I have cases where I am doing the following and it works fine.

(ex)

ViewModel.Something = this.readDataService.GetSomething();

What's the difference?

Thanks,

Rob


Looks like you are using a pre-RC2 version of ASP.NET MVC 3. ViewModel was changed to ViewBag in RC 2 (see the this post by Scott Guthrie).

With earlier previews of ASP.NET MVC 3 we exposed this API using a dynamic property called “ViewModel” on the Controller base class, and with a dynamic property called “View” within view templates. A lot of people found the fact that there were two different names confusing, and several also said that using the name ViewModel was confusing in this context – since often you create strongly-typed ViewModel classes in ASP.NET MVC, and they do not use this API.

With RC2 we are exposing a dynamic property that has the same name – ViewBag – within both Controllers and Views.

And it does look like you are trying to use ViewModel as the strongly typed model for your view. Instead, create a class to use as your model and then use @Html.LabelFor:

public class PersonModel
{
    public string Name { get; set; }
}

in the controller:

PersonModel model = new PersonModel { Name = "John" };
return View(model);

in the view:

@Html.LabelFor(model => model.Name): @Html.TextBoxFor(model => model.Name)

which renders:

<label for="Name">Name</label>: <input id="Name" name="Name" type="text" value="John" />

HTH

0

精彩评论

暂无评论...
验证码 换一张
取 消