ASP.NET MVC рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ .NET рдореЗрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ MVC рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред MVC рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рд░реНрдХрдЕрдк рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдореЗрдВ рджреЛрдиреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рд╛рдЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк ajax рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ html рдорд╛рд░реНрдХрдЕрдк рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдЧреНрд░рд╛рд╣рдХ рдкрд░ рдореЙрдбрд▓ рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдмрд╛рдж рдореЗрдВ рдПрдордбреАрдПрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд) рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдореИрдВ - рд╣рд╛рдБ!
рдЗрд╕рдХрд╛ рд╕реАрдзрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдФрд░ рдПрдордбреАрдПрдо рджреЛрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдЬреЛрдВрд╕ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдо рд╣рдореЗрд╢рд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ:
public ActionResult GetData() { return Json(new { data = new { }, meta = new { } }); }
рдпрд╣ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕рд░рд▓, рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рднрджреНрджрд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рд╣реБрдЖ рд╣реИ рдХрд┐ рдПрдордбреАрдПрдо рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ рд╕рд░реНрд╡рд░ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ http рд╣реЗрдбрд░ рдореЗрдВ рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
- рдЖрдЗрдП рдореЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред
- рд╣рдо рдЗрд╕реЗ рдПрдХ рдЬрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмреЗрд╕ 64 рдореЗрдВ рдПрдиреНрдХреЛрдб рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВрдЧреЗ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ http рд╣реИрдбрд░ рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ)ред
- рдЪрд▓реЛ "рдореЗрдЯрд╛-рдбреЗрдЯрд╛" рдирд╛рдо рдХреЗ рд╕рд╛рде http рд╣реЗрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рдореИрдВрдиреЗ рд╕рд░рд▓ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЬреЛ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореЙрдбрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЧреБрдгреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░реЗрдВред
public class Data { [ReadOnly(true)] [DisplayName("")] public int Id { get; set; } [DisplayName("")] public string Name { get; set; } }
рд╣рдо рдПрдХ рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдбреЗрдЯрд╛ рдФрд░ рдПрдордбреАрдПрдо рд▓реМрдЯрд╛рдПрдЧреАред
public ActionResult GetData() { var data = new Data { Id = 1, Name = "Test" }; var meta = ModelMetadataProviders.Current.GetMetadataForType(() => data, typeof(Data)); var metaForJS = meta.Properties.ToDictionary( p => p.PropertyName, p => new { displayName = p.GetDisplayName(), readOnly = p.IsReadOnly }); var jsonMeta = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(metaForJS);
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рдореЗрдВ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдЯрд╛рдЗрдк рдХрд░реЗрдВ: 67578 / рд╣рдм / рдЧреЗрдЯрдбрд╛рдЯрд╛ рдФрд░ http рд╣реЗрдбрд░ рдХреЛ рджреЗрдЦреЗрдВред
HTTP/1.1 200 OK Cache-Control: private Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/8.0 X-AspNetMvc-Version: 4.0 data-meta:5B%7B%22displayName%22%3A%22%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD %D0%B8%D0%B5%22%2C%22readOnly%22%3Afalse%7D%2C%7B%22displayName%22%3A%22%D0%9D %D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%2C%22readOnly%22%3Atrue%7D%5D X-AspNet-Version: 4.0.30319 ...
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡реИрд╕рд╛ рд╣реА рдХрд╛рдо рдХрд░реЗрдВ рдФрд░ рдХреЛрдб рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдл рдмрдврд╝реЗрдВред
function createField(name, value, meta) {
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдореЙрдбрд▓ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рджреЛ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдорд┐рд▓рддреЗ рд╣реИрдВред
рдмреИрдХрдмреЛрди рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рджрд┐рдЦрддрд╛ рд╣реИред рд╣рдо рдкрд╛рд░реНрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рдПрдордбреАрдПрдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
var model= Backbone.Model.extend({ .... parse: function(data, xhr){ this.meta = $.parseJSON(decodeURIComponent(xhr.getResponseHeader("data-meta"))); return data; }, ...... });
рдПрдХ рдЬреЗрдПрд╕ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ model.meta рдореЗрдВ рдПрдордбреАрдПрдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдореЗрдВ рдПрдордбреАрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
var view = Backbone.View.extend({ render: functoin(){ var m = this.model.toJSON(); this.$el.html(this.template(_.extend(m, { meta: this.model}))); } });
tempalte рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреА рддрд░рд╣:
<script > ... <label><%-meta.name.displayName%></label> <input type='text' value="<%name%>" <%-meta.readOnly ?"readonly":"" %> />" ... </script>
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдпрд╣ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред