View возвращает некоторые свойства как нулевые в Controller - PullRequest
0 голосов
/ 01 марта 2019

Это мой вид:

    @model MediaShuttleCoreWebApp.Models.MediaShuttleAPI.ApiResponse.TransferLinkResponseContainer

@{
    ViewData["Title"] = "CreateDownloadToken";
}

<h2>CreateDownloadToken</h2>


<div class="container we myBorder">
    <h3 class="text-center display-4 myBorder"> Media Shuttle </h3>
    @if (Model.User == null)
    {

    }
    <a class="btn btn-primary btn-lg" href="@Url.Action("SendEmail","MediaShuttle", Model)"
       role="button">Create Download Token</a>
    <p>Email: @Model.User.Email</p>
</div>

Теперь, когда пользователь нажимает «кнопку», которая является «тегом», он отправляет модель обратно в контроллер.Однако я заметил, что он возвращает 2 свойства как NULL, а остальные заполняются значениями, которые первоначально были переданы в View ().

Это модель, которая передается в View ():

namespace MediaShuttleCoreWebApp.Models.MediaShuttleAPI.ApiResponse
{
[DataContract]
    public class TransferLinkResponseContainer
{        
    [DataMember(Name = "id")]
    public string Id { get; set; }

    [DataMember(Name = "url")]
    public string Url { get; set; }

    [DataMember(Name = "createdOn")]
    public DateTime CreatedOn { get; set; }

    [DataMember(Name = "expiresOn")]
    public DateTime ExpiresOn { get; set; }

    [DataMember(Name = "user")]
    public User User { get; set; }

    [DataMember(Name = "grants")]
    public IList<string> Grants { get; set; }

    [DataMember(Name = "destinationPath")]
    public string DestinationPath { get; set; }

    [DataMember(Name = "notifications")]
    public IList<Notification> Notifications { get; set; }
}
}

2 свойства, которые возвращаются как NULL:

public User User { get; set; }
public IList<Notification> Notifications { get; set; }

Обратите внимание, что эти свойства2 свойства не являются вашей обычной строкой, типом int или datetime.Таким образом, сценарий, когда я передаю Модель из Контроллера в View (), у меня есть данные, но когда я передаю Модель из View () в Контроллер, в «Url.Action» только некоторые свойства заполняются оригиналом.ценности.Есть идеи, почему это происходит?Я посмотрел везде, но ничего, что на самом деле не объясняет, почему 2 из моих свойств возвращаются как нулевые.

Я думал о том, чтобы просто создать ViewModel, у которого есть эти 2 свойства различного типа, и установить их в виде строки.

Это класс для свойства User:

    [DataContract]
public class User
{
    [DataMember(Name = "email")]
    public string Email { get; set; }
}

Он просто содержит строку.

Также открыт для любых предложений.Но я действительно хочу понять, что происходит, когда Модель возвращается в Контроллер, почему эти 2 свойства возвращаются как нулевые.

1 Ответ

0 голосов
/ 02 марта 2019

Ответ лежит в теге href.Например, я буду использовать только часть вашей модели, чтобы показать, что вызывает это поведение.

public class TransferLinkResponseContainer
{
    public string Url { get; set; }

    public User User { get; set; }

    public IList<string> Grants { get; set; }
}

public class User
{
    public string Email { get; set; }
}

И позволяет создать экземпляр модели следующим образом

var model = new TransferLinkResponseContainer
{
    Url = "url",
    User = new User
    {
        Email = "test@test.com"
    },
    Grants = new List<string> { "grant1", "grant2" },
};

При такой настройке href будет содержатьследующее значение

"/MediaShuttle/SendEmail?Grants=grant1&Grants=grant2&Url=url&User=ASPNETCoreDeploy.Controllers.User"

Мы видим, что оно содержит все значения Grants, значение Url и полное имя класса User (оно отличается в вашем проекте).Это, очевидно, недопустимая строка для представления User объекта.Привязка модели не может связывать User свойства из строки "ASPNETCoreDeploy.Controllers.User" по запросу, поэтому User равно null.

Почему это происходит?Очевидно, Url.Action просто вызывает ToString метод для каждого свойства переданной модели (или итерирует коллекции и вызывает ToString для каждого элемента).Этот метод можно переопределить, но он не поможет правильно связать объект.Посмотрим, что произойдет, если мы сделаем это.Переопределить ToString для User

public class User
{
    public string Email { get; set; }

    public override string ToString()
    {
        return Email;
    }
}

и значение href становится

"/MediaShuttle/SendEmail?Grants=grant1&Grants=grant2&Url=url&User=test@test.com"

Выглядит лучше, но вы все равно получите User равно null.Чтобы правильно связать User объект, вам нужно придерживаться следующего шаблона User.Prop1=val1&User.Prop2=val2... и так далее.В вашем случае следующий URL будет работать как положено

"/MediaShuttle/SendEmail?Grants=grant1&Grants=grant2&Url=url&User.Email=test@test.com"

Но с помощью Url.Action (насколько я знаю) достичь невозможно.Вот почему более предпочтительным способом передачи сложных объектов является использование тега <form>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...