C # mvc использовать список, где условие, даже если есть ссылка на объект не установлен в экземпляр объекта errir - PullRequest
0 голосов
/ 10 февраля 2019

Я искал этот сайт для ответов на мой вопрос, но не нашел: (

Мой вопрос:

У меня есть код (в данном случае я использую код бритвы):

@foreach (IAccountingOfferAmount accountingAmount in Model.AccountingOfferAmountList)
{
  if(offerProduct.OfferProductId == accountingAmount.OfferProductId)
  {
    <span>@accountingAmount.BookAmount</span>
  }
}

[приведенный выше код является рабочей версией и не имеет проблем с этим)

, что эквивалентно

@Model.AccountingOfferAmountList
   .Where(x => x.OfferProductId == offerProduct.OfferProductId)
   .FirstOrDefault().BookAmount.ToString();

Проблема:

, если(x => x.OfferProductId == offerProduct.OfferProductId) возвращает значение NULL, код не сможет выбрать значение «BookAmount» и выдаст «Ссылка на объект не установлена ​​на экземпляр ошибки объекта».

Я могу написать:

var test =  Model.AccountingOfferAmountList
      .Where(x => x.OfferProductId == offerProduct.OfferProductId)
      .FirstOrDefault();

if(test != null)
{
  <span>@test.BookAmount.ToString()</span>
}

, и это будет работать ..

, но мой вопрос:

Есть ли какой-либо вариант, не используйте "foreach" и "если"предложения (даже без каких-либо переменных) и просто использовать одну строку кода, поэтому он будет игнорировать нулевые результаты?

, например:

@Model.AccountingOfferAmountList.Where(x => x.OfferProductId == offerProduct.OfferProductId)
    .DefaultIfNull(String.Empty)
    .FirstOrDefault().BookAmount.ToString(); 

(пример не работает, конечно, просто идеяесли в случае становится пустым, будет напечатано "" и не будет продолжать .irstOrDefault (). BookAmount.ToString ())

1 Ответ

0 голосов
/ 10 февраля 2019

Вы можете создать пользовательский помощник HTML следующим образом:

Использовать расширение ForEach в Razor

public static MvcHtmlString ForEach<T>(this IEnumerable<T> source, Func<T, Int32, string> selector)
{
    return new MvcHtmlString(String.Join("\n", source.Select(selector)));
}    

И вы можете писать какэто в cshtml:

@Model.AccountingOfferAmountList.Where(x => x.OfferProductId == offerProduct.OfferProductId).ForEach((x,i) => $"<span>{x.BookAmount}</span>")
...