2016-07-15 42 views
0

Ich habe eine jQueryUI HTML-Seite mit Registerkarten, und in seinem Inhaltsbereich für eine der Registerkarten, habe ich wie folgt ausgedrückt:Wie man die Ansicht und das Verhalten eines anderen Controllers in die Ansicht dieses "Controllers" einbaut?

<div id="tabs-1ua">       
    @RenderPage("~/Views/Admin/Create.cshtml") 
</div> 

Die Create.cshtml Seite korrekt in meiner Tab angezeigt wird, aber wenn ich erstellen der Benutzer (diese Ansicht ist eine grundlegende Benutzererstellungsseite) und klicken Sie auf die Schaltfläche, nichts passiert. Es wird kein Benutzer erstellt und es wird kein Fehler angezeigt. Das "this" html mit den Tabs befindet sich in einem anderen Controller, der keine Modellassoziationen hat. Die Benutzererstellung ist in dem Admincontroller, einschlägige Methoden unten gezeigt:

public ActionResult Create() 
{ 
    return View(); 
} 

[HttpPost] 
public async Task<ActionResult> Create(CreateModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    AppUser user = new AppUser { UserName = model.Name, Email = model.Email}; 
    IdentityResult result = await UserManager.CreateAsync(user, 
        model.Password); 

    if (result.Succeeded) 
     { 
      return RedirectToAction("Index"); 
     } 
    else 
     { 
      AddErrorsFromResult(result); 
     } 

    } 
      return View(model); 
} 

Ich habe einen Haltepunkt zu Beginn der Post-Methode, aber es wurde nie getroffen, wenn ich die Seite aus meiner anderen Seite erstellen abgerufen.

Wenn ich direkt auf diese Seite zugreife und einen Benutzer erstelle, erhalte ich das erwartete Verhalten für neue Erstellung und Validierung. Das Modell ist wie folgt:

public class CreateModel 
    { 
     [Required] 
     public string Name { get; set; } 
     [Required] 
     public string Email { get; set; } 
     [Required] 
     public string Password { get; set; } 
    } 

Und die Create.cshtml Ansicht ist wie folgt:

@model IdentityDevelopment.Models.CreateModel 
@{ ViewBag.Title = "Create User";} 
<h2>Create User</h2> 
@Html.ValidationSummary(false) 
@using (Html.BeginForm()) 
{ 
    <div class="form-group"> 
     <label>Name</label> 
     @Html.TextBoxFor(x => x.Name, new { @class = "form-control" }) 
    </div> 
    <div class="form-group"> 
     <label>Email</label> 
     @Html.TextBoxFor(x => x.Email, new { @class = "form-control" }) 
    </div> 
    <div class="form-group"> 
     <label>Password</label> 
     @Html.PasswordFor(x => x.Password, new { @class = "form-control" }) 
    </div> 
    <button type="submit" class="btn btn-primary">Create</button> 
    @Html.ActionLink("Cancel", "Index", null, new { @class = "btn btn-default" }) 
} 

Meine Fragen sind, ist es möglich, zu tun, was ich tun möchte? Wenn ja, welche Änderungen muss ich vornehmen, um den vorhandenen verfügbaren Code wiederzuverwenden?

Vielen Dank.

Antwort

1

Sie können explizit angeben, auf welche Aktionsmethode das Formular übertragen werden soll, wenn auf die Schaltfläche zum Senden geklickt wird.

Sie können diese Überladung der Html.BeginForm-Methode dazu verwenden.

public static MvcForm BeginForm(
    this HtmlHelper htmlHelper, 
    string actionName, 
    string controllerName 
) 

Aktualisieren Sie also Ihre Create-Ansicht.

@model IdentityDevelopment.Models.CreateModel 
@using (Html.BeginForm("Create","Admin")) 
{ 
    @Html.TextBoxFor(x => x.Name, new { @class = "form-control" }) 
    <button type="submit" class="btn btn-primary">Create</button> 
} 

Jetzt nomatter wo Sie diese Ansicht sind, wird es geben immer auf Admin/Create

+0

Danke, das hat funktioniert. Wie kann ich die 'return View (model);' in der Controller-Create-Methode so ändern, dass sie bei erfolgreicher Benutzererstellung auf derselben Seite bleibt? – ITWorker

+0

Sie können ein [Ajax-Formular senden] (http://stackoverflow.com/questions/10803292/how-to-send-data-in-jquery-post-to-mvc-controller-which-use-viewmodel-as) -Paramet), so dass die Seite gleich bleibt. Wenn Sie ein traditionelles Senden wünschen, übergeben Sie eine Kennung als Parameter an Ihre Teilansicht und lassen Sie sie in einem ausgeblendeten Formularelement anzeigen. Überprüfen Sie in der Aktionsmethode Erstellen diesen Wert und kehren Sie zu diesem zurück. – Shyju

0

Sie sollten Ihr Erstellungsformular in eine Teilansicht verschieben, die Sie dann mit RenderPartial rendern können. Dann machen Sie in Ihrem Eltern-HTML-Seitenformular einen Ajax-Post an den Partial Views-Controller, der die create-Methode definiert. Dann können Sie Ihren Teil überall wo Sie möchten mit der Logik in den Teilansichten Controller zentralisiert verwenden.

+0

Ist dieser Ansatz unterscheidet sich von dem von Shyju geschrieben? – ITWorker

+0

sehr ähnlich dazu ja. –