Как динамически отобразить список как имени, так и значения пары String / Boolean в MVC в ASP.NET MVC - PullRequest
2 голосов
/ 27 июля 2011

Мне нужно динамически отображать список как имени, так и значения строки строка / логическая пара в представлении MVC (* .cshtml) на основе выбора пользователя. В частности, как имя, так и значение строки и логической пары различны в каждом списке. Есть еще один список, который пользователь может выбрать. Например:

FruitName: Apple (строка: строка)

IsRipen: true (строка: логическое значение)

BookName: C #

IsSold: false

Один тип списка определяется как один тип отчета. Список можно получить из отчета программно.

Возможное решение 1 Поскольку тип данных name и value в списке фиксирован (string, boolean), одной из идей является создание коллекции в виде модели MVC и передача этой модели в представление бритвы MVC. Вопрос в том, как отобразить имя на виде

@Html.LabelFor(model => model.Names[0])  //how to display it as 'Fruit Name'

Возможное решение 2 В веб-форме ASP.NET есть пользовательский элемент управления, который может быть загружен динамически. В ASP.NET MVC есть частичное представление. Может ли частичное представление делать то, что я хочу? Или есть лучшее решение.

Я новичок в MVC, любой идеал или пример был бы очень оценен.

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Если я правильно вас понимаю, вам нужно создать частичное представление и вызвать его с помощью действия в вашем контроллере.

Сначала сделайте что-то подобное в вашем контроллере

    // partial
    public ActionResult report(string reportName)
    {
        return View(reportModel.Name);
    }

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

Затем вы можете вызвать частичное представление следующим образом:

@{Html.RenderAction("report", "Home", new{ reportName="report" });}

В строке выше будет отображено частичное представление Report.cshtml в родительском представлении или основном макете.

edit

Ok.поэтому в каждом отчете есть список пар имя-значение, верно?

Предполагая, что мы можем написать действие, которое передает этот список в ваше представление.

    public ActionResult DisplayPairs()
    {
        NameValueCollection pairs = new System.Collections.Specialized.NameValueCollection();
        pairs.Add("Name", "Value");
        pairs.Add("Name2", "Value2");
        pairs.Add("Name3", "Value3");
        pairs.Add("Name4", "Value4");

        return View(pairs);
    }

Тогда у нас будет представление DisplayPairs:

@model System.Collections.Specialized.NameValueCollection

@{
    ViewBag.Title = "DisplayPairs";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>DisplayPairs</h2>
<table>
@foreach(string key in Model.AllKeys){
    <tr><th>@key</th><td>@Model[key]</td></tr>
}
</table>

Который отображает:

Name Value 
Name2 Value2
Name3 Value3 
Name4 Value4 

Надеюсь, это поможет

2 голосов
/ 27 июля 2011

Почему бы вам просто не создать класс-обертку, содержащий все необходимые данные?

public class ReportViewModel
{
    IEnumerable<KeyValuePair<object, object>> Items { get; set; }

    public ReportViewModel()
    { Items = new List<KeyValuePair<object, object>>() }
}

Затем вы можете создать свою модель следующим образом:

var model = new ReportViewModel();
model.Items.Add("BookName", "C#");
model.Items.Add("IsSold", false);
return View(model);

В вашемвид, вы просто перебираете KeyValuePair s и печатаете ключ и значение:

<ul>
@foreach(var kvp in Model.Items)
{
    <li>@kvp.Key: @kvp.Value</li>
}
</ul>

(Извините, если мой синтаксис бритвы содержит ошибки - я пока не очень много работал с ним...)

Также вам, возможно, придется добавить вызовы к ToSting(), если в вашем списке есть нечетные типы объектов.Я думаю, что фреймворк делает это для вас, если это необходимо, но я не уверен ...

...