Asp.net mvc MVC开发中的差异

Asp.net mvc MVC开发中的差异,asp.net-mvc,Asp.net Mvc,这是一个奇怪的问题,但我需要一些指导 我一直在做一个使用MVC的项目,无论我看到什么样的例子,我看到的例子和我实际做的完全不同 所有示例都使用Razor语法,并使用@model将模型从控制器传递到视图。但是我正在做一些与我所看到的不同的事情,我想知道我是否错误地使用了MVC 我使用的不是Razor和@model,而是HTML、JQuery和javascript对象,并以这种方式获取返回的数据 所以我很困惑,我是以“正确的方式”做事还是以“错误的方式”做事 编辑:如何获取数据 // Get Cli

这是一个奇怪的问题,但我需要一些指导

我一直在做一个使用MVC的项目,无论我看到什么样的例子,我看到的例子和我实际做的完全不同

所有示例都使用Razor语法,并使用@model将模型从控制器传递到视图。但是我正在做一些与我所看到的不同的事情,我想知道我是否错误地使用了MVC

我使用的不是Razor和@model,而是HTML、JQuery和javascript对象,并以这种方式获取返回的数据

所以我很困惑,我是以“正确的方式”做事还是以“错误的方式”做事

编辑:如何获取数据

// Get ClientInfo
function GetClientInformation() {
    $.ajax({
        type: "GET",
        url: AddClientURLParam.AddGetClientInformationURL,
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (data, textStatus, jqXHR) {
            ClientDataToGet(data);
        }
    })
}
function ClientDataToGet(clientInfoData) {
    $("#txtCompanyName").val(clientInfoData.CompanyName);
    $("#txtAddress1").val(clientInfoData.Address);
    $("#txtAddress2").val(clientInfoData.Address2);
    $("#txtCity").val(clientInfoData.City);
    $("#txtState").val(clientInfoData.State);
    $("#txtZip").val(clientInfoData.ZipPostal);
    $("#txtEmail").val(clientInfoData.Email);
    $("#txtContact").val(clientInfoData.Contact);
    $("#txtPhone").val(clientInfoData.Phone);
    $("#txtWorkPhone").val(clientInfoData.WorkPhone);
    $("#txtMobile").val(clientInfoData.Mobile);
    $("#txtFax").val(clientInfoData.Fax);
    $("#txtOther").val(clientInfoData.OtherPhone);
}

JavaScript/JQuery的用途与Razor不同。Razor在服务器上生成页面,一旦客户端接收到页面,Razor就完成了

使用JSON会有一点额外的开销,这不是网站的传统方式,但在某些情况下可能是最好的。如果只调用一次JSON,那么最好让Razor生成JSON,并使用JavaScript处理客户端需要更改的内容

您可以使用JSON字符串作为模型,这样您就不必第一次访问服务器:

@model string
<!-- ... -->
<script>
var model = @Html.Raw(Model); // Raw JSON
</script>
我认为花时间学习如何开发多种方法是值得的,这样您就可以为项目使用最佳解决方案。

什么是“错误的方法”

.cshtml
文件是一个“接缝”。它们结合了C#和HTML元素

@model
是一个全局变量,有点类似于AngularJS
$scope
。其思想是,您将对每个视图使用该模型,然后验证其内容,并在客户端对其进行操作后执行服务器端操作

根据应用程序的不同,您可能不想这样做。对底层ASP.NET API使用JavaScript XHR请求来获取返回的数据是完全合理的。我相当肯定ASP.NETMVC在幕后就是这么做的。看起来你说的是你只是在用手滚动它

这是否有效实际上取决于你。痛吗?它是可测试的吗?你对代码有信心吗

根据您尝试执行的操作,可能需要检查一个客户端JavaScript MVC库(我提到过一个,还有其他库),然后使用ASP.NET Web API与服务器通信


希望这会有所帮助。

关键区别在于razor语法用于在加载时在服务器上生成页面内容(使用Microsoft的MVC框架),而您使用的AJAX模式在页面到达客户端后进行web服务调用

在Microsoft生态系统之外,您将看到更多AJAX。Web纯粹主义者倾向于使用AJAX而不是服务器端渲染,尤其是在使用AngularJS等客户端框架时

每种方法都有赞成和反对的意见

使用AJAX的客户端 纯粹主义者坚持只使用AJAX调用,并动态加载页面的各个部分。使用服务器渲染非常昂贵。在服务器上呈现页面时,您会注意到相当大的延迟(有时以秒为单位)

使用AJAX,页面可以在客户端开始呈现,同时从服务器加载其他数据。它是异步的,可以并行运行。这提供了更好的感知性能。使用服务器呈现时,在用户看到任何客户端呈现之前,必须在服务器上完全呈现页面

服务器渲染 在服务器上呈现的好处是,您可以使用Razor视图模板代码生成大量HTML,否则您将不得不在客户端上执行这些操作。如果您不使用AngularJS这样的客户机框架,您将从Microsoft的API和将逻辑嵌入HTML的一些奇特语法中获得额外的好处,这可能会很有用


使用服务器渲染并不能完全消除进行AJAX调用的需要,也不能阻止回发。

您所说的“手动滚动”是什么意思?我一点也不觉得痛苦,我对自己的做法充满信心,但当我看例子或翻阅教程时,我总觉得自己做得不对。因为所有的东西都在使用Razor,而我不是,在我的视图中,你很难在视图中的任何地方找到@model。我的意思是,你正在做Razor为你做的事情,使用JavaScript显式地发出客户端请求。如果不痛,你可能做得很好。如果它不可测试,你会在某个时候遇到问题。我会尝试不同的方法。制作一个使用主干或角度的.cshtml页面,看看您是否喜欢。制作一个只使用@model的模型,并使自己符合ASP.NET MVC规范。看看哪种感觉更舒服。无论哪种方式,可测试性都是关键。如果你正在用JavaScript编写自己的REST应用程序,而没有任何方法进行测试,那么前面提到的痛苦就在这条路上。我将尝试一下,我想这就是我担心的不符合MVC规范的地方。我喜欢任何不会引起回发的东西祝你的实验好运--Re:POST,这是WebForms比ASP.NETMVC更需要担心的问题。使用ASP.NETMVC,表单提交相对简单。我使用JQuery和Ajax从服务器获取数据。就像我有一个客户表单,当我添加一个新客户时,我使用JQuery和Ajax将数据发送到我的控制器,当我更新一个客户时,我将使用JQuery Ajax从我的控件调用该方法,然后使用返回的数据填充我的文本字段,当我更新相同的内容时,使用JQuery和Ajax将数据传递给我的controller@Chris查看数据怎么样?您正在查询数据,然后使用JavaScript显示它吗?在我最近的一个项目中,我使用JSON将数据转换成JavaScript变量,这样我就可以在客户端进行分页,而无需havi
<form>
  <div>
    @Html.LabelFor(m => m.CompanyName)
    @Html.TextBoxFor(m => m.CompanyName)
  </div>
  <!-- etc -->
</form>
public class MyModel {
  [Required, StringLength(50)]
  public string Title {get;set;}
}