ASP. NET MVC свойства привязки контроллера c свойства дочерней модели с атрибутом BindAttribute с помощью Включить - PullRequest
0 голосов
/ 03 февраля 2020

Префикс: мне не нравится этот подход, я думаю, что атрибут Bind неуклюж. Тем не менее, у меня есть сложная модель. Это вид бритвы ASP. NET MVC, который использует частичный вид.

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

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

Вот классы родительской и дочерней моделей:

public class Parent 
{
    public Menu FullMenu { get; set; }
    public KidDTO SubDTO { get; set; }
}

public class KidDTO
{
    public string Name { get; set;}
    public string Date { get; set;}
    public string Addr { get; set;}
}

Родительское представление Razor (опять же, я бы предпочел пропустить меньший DTO, который будет использоваться ... но я не есть такая опция):

@model Core.ViewModels.Parent

//Other stuff here
@{ Html.RenderPartial("_CreateEdit", Model);}

Вот дочернее представление:

@model Core.ViewModels.Parent

@using (Ajax.BeginForm("CreateEdit", "Child", new AjaxOptions {  HttpMethod = "POST"}))
{
        <div class="form-horizontal">
            <hr />
            <div class="form-group row">
                 <div class="col-md-10">
                    @Html.EditorFor(model => model.SubDTO.Name)
                </div>
            </div>

            <input type="button" value="Submit"  />
        </div>
}

Контроллер:

[HttpPost] 
public async Task<ActionResult> CreateEdit([Bind(Include="SubDTO.Name")] Parent model)
{
    // check if its Null or Not
    var IsItNull = model.SubDTO.Name;  //<--model.SubDTO.Name is always Null. ? 
    return RedirectToAction($"{ControllerEntity}Manager");
}

Итак, вкратце, если я привязываюсь к SubDTO с помощью Если он имеет значения, но тогда он позволяет связываться с другими атрибутами SubModel, чего я пытаюсь избежать?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Мне не удалось понять, как настроить свойства Include для работы со дочерними моделями. Я мог связать только весь ребенок или ничего. Однако я заставил его работать, используя [Bind (Prefix = "")] в контроллере, вот так

Контроллер.

  [HttpPost] 
public async Task<ActionResult> CreateEdit([Bind(Prefix="SubDTO.Name")] string childName)
{
    // check if its Null or Not
    var IsItNull = childName  //<--UGLY but Appears to work, This is not Ideal.  
    return RedirectToAction($"{ControllerEntity}Manager");
}

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

0 голосов
/ 05 февраля 2020

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

    public class Parent 
{
    public Menu FullMenu { get; set; }
    public KidDTO SubDTO { get; set; }
}
[Bind(Include = "Name")]
public class KidDTO
{
    public string Name { get; set;}
    public string Date { get; set;}
    public string Addr { get; set;}
}

Контроллер

    [HttpPost] 
public async Task<ActionResult> CreateEdit(Parent model)
{
    // check if its Null or Not
    var IsItNull = model.SubDTO.Name;   
    return RedirectToAction($"{ControllerEntity}Manager");
}

Form Collection Post

  [HttpPost]
    public async Task<ActionResult> CreateEdit(FormCollection collection)
    {
        var subDTO = new KidDTO()
        {
            Name = collection["SubDTO.Name"]
        };
        // check if its Null or Not
        var IsItNull = subDTO.Name;
        return RedirectToAction($"{ControllerEntity}Manager");
    }

cs html кнопка изменения типа для отправки

    <input type="submit" value="Submit"  />

Чтобы все было просто и понятно, попробуйте создать отдельную модель просто со свойством Name. Недостаток использования явного [Bind] заключается в том, что теперь вы можете привязывать только к Имени, используя связыватель модели по умолчанию, так почему бы просто не создать новую ViewModel для начала?

...