2017-05-31 77 views
0

首先,我是Umbraco的新手,所以如果您看到一些基本錯誤,請不要評價我。無法將源類型Umbraco.Web.Models.RenderModel綁定到模型類型Repower.Cms.Umbraco.Models.Test

所以我創建目前,他去到數據庫的登錄形式(檢查用戶名和密碼),並讀取他返回的值,並讓他Cannot bind source type Umbraco.Web.Models.RenderModel to model type Repower.Cms.Umbraco.Models.Test.

這是我的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> 
} 

這是我的模型:

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; 
    } 
} 

這是我的控制器:

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); 
    } 
} 

因此,我繼承了RenderModel,因爲之前我的錯誤是「傳入字典的模型項目的類型爲Repower.Cms.Umbraco.Models.Test',但此字典需要類型爲」Umbraco「的模型項目。 Web.Models.RenderModel」。」 所以我改變了它(在互聯網上搜索了很多),現在我得到這個錯誤。

其他代碼是否正確?我訪問數據庫的方式和一切?我期待從數據庫返回值(不知道這是否正確)

有人請幫助我嗎? 今天我需要完成這件事。

在此先感謝

回答

1

您的實施有幾個問題。

使用一把umbraco MemberService

你通過建立持有會員信息(如用戶名和密碼)的新表重新發明輪子。

Umbraco建立了可處理您網站成員的會員資格。您可以在Umbraco中的/umbraco/#/member查看GUI。使用這個GUI,你可以手動創建和編輯成員。

您也可以使用此MemberService以編程方式創建本節中的結束編輯成員。

例如,註冊會員:

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); 

登錄:

var memberService = ApplicationContext.Current.Services.MemberService; 

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

您可以瞭解什麼其他方法可用here

你混淆了你的MVC

Test模式不是單純的模型,也有它的一些控制,因爲它正在處理數據庫的東西呢!

理想情況下,您的模型應該只包含已向前發送的數據,並且您的TestController應該使用該數據進行處理。

作爲固定的結合問題

你當前在頁面視圖模式設置爲Repower.Cms.Umbraco.Models.Test,在那裏,因爲我認爲它應該保持原樣。

停止從RenderModel繼承此模型。

相反,使用您的代碼呈現部分內容。

爲了您的頁面視圖:

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

部分叫Login.cshtml

@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> 
} 

最後,更新您的控制器從SurfaceController繼承。

我希望這有助於

這不是完整的解決方案,但應該可以幫助你下車在正確的軌道上。

+0

太棒了!非常感謝你,這工作!現在在登錄它給我一個錯誤,它說'string retunvalue =(string)sqlcomm.Parameters [「@ RESULT」]。Value;'錯誤是:System.InvalidCastException:'無法將對象鍵入'System.Int32'鍵入'System.String'。' 你有什麼想法可能是什麼?我是否以正確的方式訪問數據庫? 非常感謝! –

+0

數據庫可能返回已更改行數的整數(所以我猜測整數爲1)。您可以使用'sqlcomm.Parameters [「@Result」]。Value.ToString()'或更好,但不會將其強制轉換爲字符串:'int retunvalue = sqlcomm.Parameters [「@ RESULT」]。Value' – Harvey

+0

I made it工作!非常感謝你! –