2017-05-31 2 views
0

Zunächst einmal bin ich neu bei Umbraco, also wenn Sie einige grundlegende Fehler sehen, urteilen Sie nicht über mich.Kann den Quellentyp Umbraco.Web.Models.RenderModel nicht an den Modelltyp binden. Repower.Cms.Umbarco.Models.Test

So derzeit ein Login-Formular Ich schaffe, die er an die Datenbank geht (Check Benutzername und Passwort) und den Wert liest, die er zurückkommt und ihn uns lassen Cannot bind source type Umbraco.Web.Models.RenderModel to model type Repower.Cms.Umbraco.Models.Test.

Das ist mein HTML:

@inherits Umbraco.Web.Mvc.UmbracoViewPage<Repower.Cms.Umbraco.Models.Test> 

@{ 
    Layout = "Master.cshtml"; 
} 

<style type="text/css"> 
    .btnStyle { 
     border: thin solid #000000; 
     line-height: normal; 
     width: 80px; 
    } 
</style> 
@using (Html.BeginForm("Test", "MembersProtectedPage", FormMethod.Post)) 
{ 
    <div class="fontStyle"> 
     <center> 
      <table style="margin-top: 100px;margin-left:150px"> 
       <tr style="height:30px"> 
        <td align="right"> 
         @Html.LabelFor(m => m.User) 
        </td> 
        <td style="width:200px" align="right"> 
         @Html.TextBoxFor(m => m.User) 
        </td> 
        <td style="width:250px;color:Red" align="left"> 
         @Html.ValidationMessageFor(m => m.User) 
        </td> 
       </tr> 
       <tr style="height:30px"> 
        <td align="right"> 
         @Html.LabelFor(m => m.Password) 
        </td> 
        <td align="right"> 
         @Html.PasswordFor(m => m.Password) 
        </td> 
        <td style="width:250px;color:Red" align="left"> 
         @Html.ValidationMessageFor(m => m.Password) 
        </td> 
       </tr> 
       <tr style="height:30px"> 
        <td colspan="2" align="center"> 
         <input type="submit" value="Sign In" class="btnStyle" /> 
        </td> 
       </tr> 
      </table> 
     </center> 
    </div> 
} 

Das ist mein Modell:

public class Test : RenderModel 
{ 
    public Test() : this(new UmbracoHelper(UmbracoContext.Current).TypedContent(UmbracoContext.Current.PageId)) { } 
    public Test(IPublishedContent content, CultureInfo culture) : base(content, culture) { } 
    public Test(IPublishedContent content) : base(content) { } 

    string connString = ConfigurationManager.ConnectionStrings["connectionStringName"].ConnectionString; 
    SqlConnection conn; 
    SqlCommand sqlcomm; 

    public string User { get; set; } 
    public string Password { get; set; } 

    public bool IsUserExist(string emailid, string password) 
    { 
     bool flag = false; 
     conn = new SqlConnection(connString); 
     conn.Open(); 

     sqlcomm = new SqlCommand(); 
     sqlcomm.Connection = conn; 
     sqlcomm.CommandType = System.Data.CommandType.StoredProcedure; 
     sqlcomm.CommandText = "dbo.uspLogin"; 
     sqlcomm.Parameters.AddWithValue("@pLoginName", User); 
     sqlcomm.Parameters.AddWithValue("@pPassword", Password); 

     SqlParameter retval = sqlcomm.Parameters.Add("@RESULT", SqlDbType.VarChar); 
     retval.Direction = ParameterDirection.ReturnValue; 
     sqlcomm.ExecuteNonQuery(); // MISSING 
     string retunvalue = (string)sqlcomm.Parameters["@RESULT"].Value; 

     switch (retunvalue) 
     { 
      case "0": 
       flag = true; 
       break; 
      case "1": 
       flag = false; 
       break; 
      case "2": 
       flag = false; 
       break; 
      default: 
       flag = false; 
       break; 
     } 
     return flag; 
    } 
} 

Und das ist mein Controller:

public class TestController : Controller 
{ 
    public ViewResult Login() 
    { 
     return View(); 
    } 

[HttpPost, ValidateInput(false)] 
public ActionResult Login(Test model) 
{ 
    if (ModelState.IsValid) 
    { 
     if (model.IsUserExist(model.User, model.Password)) 
     { 
      ViewBag.UserName = model.User; 
      FormsAuthentication.RedirectFromLoginPage(model.User, false); 
     } 
     else 
     { 
      ModelState.AddModelError("", "Username or Password Incorrect."); 
     } 
    } 
    return View(model); 
    } 
} 

Also erbte ich ein RenderModel, weil mein Fehler zuvor "Das in das Wörterbuch übergebene Modellelement war vom Typ Repower.Cms.Umbarco.Models.Test", aber dieses Wörterbuch benötigt ein Modellelement vom Typ 'Umbraco. Web.Models.RenderModel '. " Also habe ich es geändert (viel im Internet gesucht) und jetzt bekomme ich diesen Fehler.

Ist auch der Rest des Codes korrekt? Die Art, wie ich auf die Datenbank zugreife und alles? Ich erwarte einen Rückgabewert von der Datenbank (weiß nicht, ob das korrekt ist)

Könnte mir bitte jemand helfen? Ich muss das heute machen.

Vielen Dank im Voraus

Antwort

1

Es gibt ein paar Probleme mit Ihrer Implementierung.

Verwenden Sie die Umbraco Mitgliederservice

Sie das Rad neu zu erfinden, indem Sie einen neuen Tisch bauen, die Mitgliedsinformationen (wie zB Benutzername und Passwort) hält.

Umbraco hat eine integrierte Mitgliedschaft, mit der Mitglieder Ihrer Website umgehen können. Sie können die GUI in Umbraco unter /umbraco/#/member anzeigen. Mit dieser GUI können Sie Mitglieder manuell erstellen und bearbeiten.

Sie können auch Endbearbeitungselemente in diesem Abschnitt mithilfe dieser MemberService programmgesteuert erstellen.

Zum Beispiel registrieren Mitglied:

var MemberService = ApplicationContext.Current.Services.MemberService 

var member = MemberService.CreateMemberWithIdentity(newEmail, newEmail, newName, "Member"); 

MemberService.Save(member); 
MemberService.SavePassword(member, newPassword); 

FormsAuthentication.SetAuthCookie(newEmail, true); 

Anmeldung:

var memberService = ApplicationContext.Current.Services.MemberService; 

if (memberService.Exists(email)) 
{ 
    if (Membership.ValidateUser(email, password)) 
    { 
     FormsAuthentication.SetAuthCookie(email, true); 
    } 
} 

Sie können nachlesen, was andere Methoden zur Verfügung here sind.

Sie vermischen Ihre MVC

Ihr Test Modell nicht nur ein Modell ist, hat auch einige Controller in es, wie es Datenbank Material auch ist der Umgang mit!

Idealerweise sollte Ihr Modell nur die Daten enthalten, die gesendet wurden, und Ihre TestController sollte diese Daten verarbeiten.

Wie für Ihre Bindung Ausgabe

Festsetzung Du bist gerade Ihre Seite Ansicht Modell Repower.Cms.Umbraco.Models.Test Einstellung, wo, wie ich denke, es sollte so bleiben, wie ist.

Stoppen Sie dieses Modell von erben von RenderModel.

Rendern Sie stattdessen einen Teil mit Ihrem Code.

Für Ihre Seite Ansicht:

@inherits Umbraco.Web.Mvc.UmbracoViewPage 
@{ 
    Layout = "Master.cshtml"; 
} 
@Html.Partial("Login", new Repower.Cms.Umbraco.Models.Test()) 

Teil Login.cshtml genannt:

@model Repower.Cms.Umbraco.Models.Test 
@using (Html.BeginUmbracoForm<TestController>("Login")) 
{ 
    <div class="fontStyle"> 
     <center> 
      <table style="margin-top: 100px;margin-left:150px"> 
       <tr style="height:30px"> 
        <td align="right"> 
         @Html.LabelFor(m => m.User) 
        </td> 
        <td style="width:200px" align="right"> 
         @Html.TextBoxFor(m => m.User) 
        </td> 
        <td style="width:250px;color:Red" align="left"> 
         @Html.ValidationMessageFor(m => m.User) 
        </td> 
       </tr> 
       <tr style="height:30px"> 
        <td align="right"> 
         @Html.LabelFor(m => m.Password) 
        </td> 
        <td align="right"> 
         @Html.PasswordFor(m => m.Password) 
        </td> 
        <td style="width:250px;color:Red" align="left"> 
         @Html.ValidationMessageFor(m => m.Password) 
        </td> 
       </tr> 
       <tr style="height:30px"> 
        <td colspan="2" align="center"> 
         <input type="submit" value="Sign In" class="btnStyle" /> 
        </td> 
       </tr> 
      </table> 
     </center> 
    </div> 
} 

Schließlich aktualisieren Sie Ihre Controller von SurfaceController zu erben.

Ich hoffe, das hilft

Dies ist nicht die komplette Lösung, sondern sollten Sie auf dem richtigen Weg aussteigen können.

+0

Großartig! Vielen Dank, das hat funktioniert! Die Sache ist jetzt auf der Anmeldung gibt es mir einen Fehler, wo es heißt string retunvalue = (String) sqlcomm.Parameters ["@ RESULT"]. Value; 'Der Fehler ist: System.InvalidCastException: 'Kann nicht Objekt von Geben Sie 'System.Int32' ein, um 'System.String' einzugeben. ' Haben Sie eine Idee, was es sein könnte? Gehe ich auf die richtige Weise auf die Datenbank? Vielen Dank! –

+0

Die Datenbank gibt wahrscheinlich eine Ganzzahl der Anzahl der Zeilen zurück, die geändert wurden (also rate ich die Ganzzahl '1'). Sie könnten 'sqlcomm.Parameters [" @ RESULT "]. Value.ToString()' oder besser noch nicht in String konvertieren: 'int retunvalue = sqlcomm.Parameters [" @ RESULT "]. Wert' – Harvey

+0

Ich habe es geschafft Arbeit! Vielen Dank! –

Verwandte Themen