MVC Grid отображает другое значение

1

По мнению, у меня есть:

grid.Column("Complete", header: "Verified", format:  (item) => @Html.Raw(item.Complete))

item.complete - целое число. Я создал метод расширения, чтобы отобразить соответствующее строковое значение, поскольку есть только 3 возможности. Вот способ расширения:

   public static string CompleteValue(this int value)
    {

        switch (value)
        {
            case 0:
                return "Submitted";
            case 1:
                return "Verified - Incomplete";
            case 2:
                return "Verified - Complete";
        }
        //Default if we get this far
        return "Submitted";
    }

Я не знаю, как написать код Razor, чтобы он работал. Я попытался поставить ".CompleteValue" несколько мест в коде, но ничего не работает. У кого-нибудь есть предложения?

Изменение: это представление:

@model IEnumerable<SendMailwithAttachment.Models.MailModel>
@using System.Activities.Statements
@using Hazards
@using SendMailwithAttachment.Models;
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>My Hazards</h2>
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
@{

    var dataContext = new HazardsDataContext();

    var getHazards1 = from m in dataContext.Mail
                     where (m.User == User.Identity.Name)
                     select new{m.casenum,m.ID,m.User,m.Date,m.To,m.name,m.Hazard,m.PictureDataAsByte,
                         m.Risk,m.AfterPicture,m.status,m.Complete};

    var getHazards = from n in getHazards1
        orderby n.Complete  // Order by the Completed (or Verified Status so that verified reports show up last)
        select n;

    var grid = new WebGrid(source: getHazards);

    if (getHazards.Count() > 0)
    {     

        @grid.GetHtml(columns: new[] {
        grid.Column("Casenum", header: "Case #"),
        grid.Column("Date", header: "Date"),
        grid.Column("Hazard", header: "Hazard"),
        grid.Column("Before",header: "Before",format:
        @<Text><img src="@Url.Content(item.PictureDataAsByte)" width="175" height="175" />
        </text>),
        grid.Column("Risk", header: "Risk"),
        grid.Column("After",header: "After",format:
        @<Text><img src="@Url.Content(item.AfterPicture)" width="175" height="175" />
        </Text>),
        grid.Column("status", header: "Status"),
        //grid.Column("Complete", header: "Verified", format:(item) => (item.Complete))
        grid.Column("Complete", header: "Verified", format:  (item) => @Html.CompleteValue(item.Complete))
        //grid.Column("Complete", header: "Verified", format: (item) => @Html.Raw("<input type='checkbox' " + ((item.Complete==0) ? "checked" : "") + " disabled='disabled' />")),

})

     }
    else
    {
  @Html.Raw("No Data Found")
    }
}
  • 0
    Хотите создать расширение HTMLHelper?
  • 0
    Это было бы хорошо. Я просто не знаю, как подойти к этому.
Теги:
razor
asp.net-mvc

2 ответа

1

Вам нужно добавить пространство имен, для этого требуется С#, чтобы получить расширение.

using My.Namescape.ExtensionClass;

Поместите его прямо на бритву. Кроме того, вы можете добавить его в файл Web.config в папке "Представления". Таким образом, он доступен для всех видов Razor.

0

Вам не нужно писать код Razor, если вы создаете для него HTMLHelper. Этот помощник может использоваться столько раз, сколько вы хотите. Поэтому вам не нужно добавлять это к своему виду каждый раз.

Класс, который, я думаю, вам следует добавить, будет выглядеть следующим образом:

public static class MVCHelpers
{
    public static MvcHtmlString CompleteValue(this HtmlHelper htmlHelper, int value)
    {
        //create the html helper
        var builder = new TagBuilder("text");
        //Check value
        switch (value)
        {
            case 0:
                builder.SetInnerText("Submitted");
                break;
            case 1:
                builder.SetInnerText("Verified - Incomplete");
                break;
            case 2:
                builder.setInnerText("Verified - Complete");
                break;
            default:
                builder.setInnerText("Submitted");
        }
        return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
    }
}

Итак, теперь мы создали HTMLHelper, чтобы перейти к представлению. Добавлен следующий код в начало вашего представления:

@namespace YourNameSpace

Или, если вы хотите, чтобы HTMLHelper был доступен для всех ваших представлений, вставьте следующую строку в свой web.config:

<add namespace="YourNameSpace" />

Теперь измените следующую строку в своем представлении:

grid.Column("Complete", header: "Verified", format:  (item) => @Html.Raw(item.Complete))

Для того, чтобы:

grid.Column("Complete", header: "Verified", format:  (item) => @Html.CompleteValue(item.Complete))

Теперь вы создали свой собственный HTMLHelper. Надеюсь, это решает ваш вопрос. Если у вас есть дополнительные вопросы о том, как заставить это работать. Пожалуйста спросите:)

Примечание. Я набрал этот код без IDE, поэтому в нем могут быть некоторые синтаксические ошибки.

  • 0
    Мы могли бы быть ближе. Но вот ошибка, которую я получаю: Сообщение об ошибке компилятора: CS1973: «System.Web.Mvc.HtmlHelper <System.Collections.Generic.IEnumerable <SendMailwithAttachment.Models.MailModel >>» не имеет применимого метода с именем «CompleteValue», но, похоже, есть метод расширения с этим именем. Методы расширения не могут быть динамически отправлены. Рассмотрите приведение динамических аргументов или вызов метода расширения без синтаксиса метода расширения.
  • 0
    Кроме того, setInnerText является SetInnerText для всех, кто использует этот ответ.
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню