asp.net MVC 3, Html.EditorFor в разных моделях - PullRequest
2 голосов
/ 29 января 2012

У меня есть 2 класса в модели

public class User
{
    public int UserID { get; set; }
    public string UserName { get; set; }
}

public class Product
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

У меня есть представление, которое использует оба класса, и мне нужно использовать html.TextBoxFor.Я могу создать BigModel:

public class BigModel
{
    public User user;
    public Product product;
}

, поэтому в View:

@model BigModel
@Html.TextBoxFor(m=> m.user.UserName)
@Html.TextBoxFor(m=> m.product.ProductName)    

Или я могу использовать другое частичное представление и переотображать их.Но они не мое любимое решение.

Разве нет другого пути?такие как:

<p>    
    User Name:
    @Html.TextBoxFor<User>(u=> u.UserName)
</p>
<p>    
    Product Name:
    @Html.TextBoxFor<Product>(p=> p.ProductName)
</p>

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Посмотрите на TextBoxFor подпись метода:

public static MvcHtmlString TextBoxFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression
)

Это невозможно.написать:

@Html.TextBoxFor<Product>(p=> p.ProductName)

Так что вы "застряли" с этим:

@Html.TextBoxFor(m=> m.product.ProductName)

(я не знаю, почему вы предпочитаете первую версию, это даже на один символ длиннее ... =) )

0 голосов
/ 06 апреля 2017

С C # 6 вы можете подумать о том, чтобы не использовать помощник @Html, а просто записать ввод в виде простого HTML.

Например:

<input type="text" name="@($"{nameof(BigModel.User)}.{nameof(User.UserName)})" />

Это также удобно, когдане использовать ту же модель для получения в качестве обратной передачи.

0 голосов
/ 29 января 2012

Как вы думаете, как именно вы получите ссылку на пользователя и продукт таким образом? Обобщения представляют только ТИП объекта, а не экземпляр объекта. Тем не менее, нет общих версий этих.

Недавно я видел несколько таких квестонов. Что такого сложного в ссылках на полный тип? Почему у людей проблемы с этим?

Если вы передаете представление данных ViewBag, то вы можете просто сделать это:

@Html.TextBoxFor(m => ViewBag.Value)

Однако это довольно глупо, поскольку а) вы теряете привязку модели и б) не набираете строгую типизацию, поэтому вы можете просто использовать не строго типизированный.

@Html.TextBox("Value", ViewBag.Value);
...