2015-08-03 3 views
1

Я создал этот вид класс модели:экземпляр ViewModel является недействительным по созданию

using System.Collections.Generic; 
using Microsoft.Azure.ActiveDirectory.GraphClient; 

namespace xx.Models.GlobalAdmin.Models 
{ 
    public class UserViewModel 
    { 
     public User Usuario { get; set; } 
     public List<string> SelectedCompanies { get; set; } 
    } 
} 

и я изменил свое Create.cshtml из класса User из активной директории это:

@model CapatechSaasApp.Models.GlobalAdmin.Models.UserViewModel 

и все управления, как это:

<div class="form-group"> 
    @Html.Label("Usuario", new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     <div class="input-group"> 
      @Html.EditorFor(model => model.Usuario.UserPrincipalName) 
      <span class="input-group-addon" id="basic-addon2">@SettingsHelper.Domain.ToString()</span> 
      @Html.Validatiomodel => model.Usuario.UserPrincipalName) 
     </div> 
    </div> 
</div> 

Я также изменил Создать действие этого:

public async Task<ActionResult> Create(
    [Bind(Include = "UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department" 
       )] CapatechSaasApp.Models.GlobalAdmin.Models.UserViewModel user, FormCollection formCollection) 
     { 
      ActiveDirectoryClient client; 
      try 
      { 
       client = AuthenticationHelper.GetActiveDirectoryClient(); 
      } 
      catch (Exception) 
      { 
       if (Request.QueryString["reauth"] == "True") 
       { 
        // 
        // Send an OpenID Connect sign-in request to get a new set of tokens. 
        // If the user still has a valid session with Azure AD, they will not be prompted for their credentials. 
        // The OpenID Connect middleware will return to this controller after the sign-in response has been handled. 
        // 
        HttpContext.GetOwinContext() 
         .Authentication.Challenge(OpenIdConnectAuthenticationDefaults.AuthenticationType); 
       } 

       // 
       // The user needs to re-authorize. Show them a message to that effect. 
       // 
       ViewBag.ErrorMessage = "AuthorizationRequired"; 
       return View(); 
      } 

      try 
      { 
       var usuario = user.Usuario.UserPrincipalName; 
       user.Usuario.UserPrincipalName = usuario+SettingsHelper.Domain; 
       user.Usuario.MailNickname = usuario; 
       user.Usuario.AccountEnabled = true; 
       await client.Users.AddUserAsync(user.Usuario); 

       //Setting extended property lookup name 
       var extPropLookupName = $"extension_{SettingsHelper.ClientId.Replace("-", "")}_{"Compania"}"; 

       //TO BE FINISHED 
       user.Usuario.SetExtendedProperty(extPropLookupName, formCollection["Empresa"]); 
       await user.Usuario.UpdateAsync(); 
       //Task.WaitAll(); 

       // Save the extended property value to Azure AD. 
       user.Usuario.GetContext().SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      catch (Exception exception) 
      { 
       ModelState.AddModelError("", exception.Message); 
       return View(); 
      } 
     } 

Однако user.Usuario всегда является Null, и я не могу получить значения, введенные в форму.

Я предполагаю, что может быть что-то не так с

[Bind(
        Include = 

Но я не знаю, что это может быть или синтаксис

+0

Приведи также [этот ответ] (http://stackoverflow.com/questions/31742437/нулевое значение ошибки, когда-пытаясь в изготовлении-ViewModel-элемент равных переменный/31788391 # 31788391). И удалите из метода бессмысленный параметр 'FormCollection formCollection'. –

ответ

1

Прежде всего, я не знаю, что хуже всего, волшебная строка распространения по коду, уродливую архитектуру или тот факт, что вы в основном добавляете все теги версии mvc к вопросу вместо версии, над которой работаете.

Это связывание является связующим.

По определению Model Binder Когда выполняется «Создать», связующее устройство модели MVC будет использовать параметры запроса для заполнения свойств параметра пользователя, как вы должны знать. Однако атрибут Bind указывает связующемуся модели только заполнять свойства указанными именами.

бьет «Новичок» всегда нулевой, потому что вы не передавая имущество в этой уродливой и гигантской волшебной строке

[Bind(Include = "UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department" 
+0

что там синтаксис? –

+0

[Bind (Include = "Usuario, UserPrincipalName, AccountEnabled, PasswordProfile, MailNickname, DisplayName, GivenName, Surname, JobTitle, Department" попробуйте один –

+2

Лучше всего не использовать его вообще. «Bind» - это еще одна уловка Microsoft бросила в MVC, который никогда не должен существовать в первую очередь. Он не сильно типизирован, поскольку по своей природе он состоит из строки имен свойств без проверки, если они верны или нет. Весь смысл использования представления модель должна только реализовать свойства, которые пользователь должен иметь возможность касаться. Таким образом, «Bind» и использование моделей просмотра являются взаимоисключающими подходами. –

Смежные вопросы