【问题标题】:Cannot bind source type Umbraco.Web.Models.RenderModel to model type Repower.Cms.Umbraco.Models.Test无法将源类型 Umbraco.Web.Models.RenderModel 绑定到模型类型 Repower.Cms.Umbraco.Models.Test
【发布时间】:2017-05-31 08:03:05
【问题描述】:

首先,我是 Umbraco 的新手,所以如果您看到一些基本错误,请不要评判我。

所以我目前正在创建一个登录表单,他进入数据库(检查用户名和密码)并读取他返回的值并让他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”类型的模型项。模型.RenderModel'。” 所以我改变了它(在互联网上搜索了很多),现在我得到了这个错误。

其余的代码也正确吗?我访问数据库和所有内容的方式?我期待来自数据库的返回值(不知道这是否正确)

有人可以帮助我吗? 我今天需要完成这项工作。

提前致谢

【问题讨论】:

    标签: sql asp.net-mvc model controller umbraco


    【解决方案1】:

    您的实施存在一些问题。

    使用 Umbraco 会员服务

    您正在重新发明轮子,创建一个包含成员信息(例如用户名和密码)的新表。

    Umbraco 内置了可以处理您网站成员的会员资格。您可以在 /umbraco/#/member 查看 Umbraco 中的 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 继承。

    我希望这会有所帮助

    这不是完整的解决方案,但应该可以帮助您走上正轨。

    【讨论】:

    • 太棒了!非常感谢,成功了!事情现在在登录它给我一个错误,它说string retunvalue = (string)sqlcomm.Parameters["@RESULT"].Value;错误是:System.InvalidCastException:'无法将'System.Int32'类型的对象转换为'System.String'类型。你知道它可能是什么吗?我是否以正确的方式访问数据库?非常感谢!
    • 数据库可能返回一个整数,表示已更改的行数(所以我猜是整数1)。您可以使用 sqlcomm.Parameters["@RESULT"].Value.ToString() 或更好,而不是将其转换为字符串:int retunvalue = sqlcomm.Parameters["@RESULT"].Value
    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多