METANIT.COM

Processing by controller as html

При обращении к веб-приложению, как правило, пользователь ожидает получить некоторый ответ, например, в виде веб-страницы, которая наполнена данными. На стороне сервера метод контроллера, получая параметры и данные запроса, обрабатывает их и формирует ответ в виде результата действия. Результат действия — это тот объект, который возвращается методом после обработки запроса.

Результатом действия может быть практически что угодно. Например, в прошлых темах использовался объект string, например:

Пользователь передает методу некоторые значения и ответ на запрос видит в своем браузере строку ответа.

Результатом действия может быть какой-нибудь сложный объект:

using Microsoft.AspNetCore.Mvc; namespace MvcApp.Controllers < public class HomeController : Controller < public Message Index() =>new Message("Hello METANIT.COM"); > public record class Message(string Text); >

Результатом может быть даже void , то есть по сути ничего:

В данном случае метод GetVoid представляет вполне реальное действие контроллера, к которому можно обращаться из адресной строки браузера, передавать параметры, и который может содержать сложную логику обработки запроса. Только после обращения к этому методу пользователь увидит в своем веб-браузере одну пустоту, так как метод ничего не возвращает.

Но в большинстве случаев мы будем иметь дело не с void и даже не с типом string, а с объектами типа IActionResult , которые непосредственно предназначены для генерации результата действия. Интерфейс IActionResult находится в пространстве имен Microsoft.AspNetCore.Mvc и определяет один метод:

public interface IActionResult

Метод ExecuteResultAsync() принимает контекст действия и выполняет генерацию результата.

Этот интерфейс затем реализуется абстрактным базовым классом ActionResult :

public abstract class ActionResult : IActionResult < public virtual Task ExecuteResultAsync(ActionContext context) < ExecuteResult(context); return Task.FromResult(true); >public virtual void ExecuteResult(ActionContext context) < >>

ActionResult добавляет синхронный метод, который выполняется в асинхронном. И если мы вдруг захотим создать свой класс результата действий, то как раз можем либо унаследовать его от ActionResult, либо реализовать интерфейс IActionResult.

Итак, создадим свой класс результата действий. Для этого вначале добавим в проект новый класс, который назовем HtmlResult :

IActionResult и создание своего результата действий в ASP.NET Core MVC и C#

Определим в нем следующий код:

using Microsoft.AspNetCore.Mvc; namespace MvcApp < public class HtmlResult : IActionResult < string htmlCode; public HtmlResult(string html) =>htmlCode = html; public async Task ExecuteResultAsync(ActionContext context) < string fullHtmlCode = @$"    "; await context.HttpContext.Response.WriteAsync(fullHtmlCode); > > >

Данный класс будет реализовать интерфейс IActionResult. В конструкторе он принимает html-код, который затем будет выводиться на веб-страницу. Для вывода используется асинхронный метод context.HttpContext.Response.WriteAsync()

Теперь используем этот класс в контроллере:

using Microsoft.AspNetCore.Mvc; namespace MvcApp.Controllers < public class HomeController : Controller < public IActionResult Index() < return new HtmlResult("

Hello METANIT.COM!

"); > > >

Здесь определен метод Index() , который возвращает объект HtmlResult. При обращении к этому объекту будет срабатывать его метод ExecuteResultAsync() , в котором будет происходить генерация html-страницы:

Создание результата действий и IActionResult в ASP.NET Core MVC и C#

Однако в большинстве случаев нам не придется создавать свои классы результатов, потому что фреймворк ASP.NET Core MVC итак предоставляет довольно большую палитру классов результатов для самых различных ситуаций:

  • ContentResult : отправляет в ответ в виде строки
  • EmptyResult : отправляет пустой ответ в виде статусного кода 200

public IActionResult GetVoid()
public IActionResult GetVoid()

public class HomeController : Controller < public IActionResult Index() < return new ObjectResult(new Person("Tom", 37)); >> record class Person(string Name, int Age);

LocalRedirectResult : перенаправляет пользователя по определенному адресу URL в рамках веб-приложения

Рассмотрим некоторые из этих классов.

Источник

Processing by xController#show / update as HTML instead as JS

I have a table in my database and I’m showing in a page. The problem happens when I am saving the changes. I need the Rails process using js and not redirect the user to another page when you click save. So far, I can save changes but I am always redirected to other pages processed by HTML instead JS. controller:

filter_resource_access :nested_in => :releases filter_resource_access :nested_in => :project respond_to :js, only: [:update, :edit, :show] respond_to :html before_filter :load_issue, :load_project, :load_release def edit end def update if @issue_value.update_attributes(params[:issue_value]) flash.now[:notice] = t('messages.successfully_updated_entity.f', :entity => IssueValue.model_name.human) respond_to do |format| format.js end end end 
        "clickable" do %>     true, 'data-default-action' => true %> 
   true, :html => "margin:0"> do |f| %> 
IssueType.human_attribute_name(:name), :autofocus => true, :class => "span10" %>
IssueValue.human_attribute_name(:value), :autofocus => true, :class => "span2" %>
IssueValue.human_attribute_name(:client_value), :class => "span2" %>
t('messages.please_wait'), :class => 'btn small', :remote => true %>
  1. edit.js.erb
  2. show.js.erb
  3. update.js.erb
  4. _form_row.html.erb
  5. _issue_values_table.html.erb

Well, I don’t undestand why this not works.

Started GET «/projects/pro-/releases/release02/values/14/edit» for 127.0.0.1 at 2013-12-13 08:39:36 -0200 Processing by IssueValuesController#edit as JS Parameters: «pro-«, «release_id»=>»release02», «id»=>»14″> SQL (0.5ms) SHOW TABLES User Load (0.1ms) SELECT users .* FROM users WHERE (( users . auth_token = ‘ji2lt8p1185q6q1l’ AND users . status_id = 2)) LIMIT 1 SQL (1.5ms) describe releases_browser_versions SQL (0.6ms) describe releases_os_versions SQL (0.7ms) describe releases_mobile_models Release Load (0.1ms) SELECT releases .* FROM releases WHERE releases . identifier = ‘release02’ LIMIT 1 IssueValue Load (0.1ms) SELECT issue_values .* FROM issue_values WHERE issue_values . id = 14 LIMIT 1 SQL (0.6ms) SHOW TABLES Project Load (0.1ms) SELECT projects .* FROM projects WHERE projects . identifier = ‘pro-‘ LIMIT 1 CACHE (0.0ms) SELECT issue_values .* FROM issue_values WHERE issue_values . id = 14 LIMIT 1 Rendered issue_values/_form_row.html.erb (34.6ms) Rendered issue_values/edit.js.erb (36.1ms) Completed 200 OK in 642ms (Views: 50.4ms | ActiveRecord: 4.3ms) [2013-12-13 08:39:36] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

Started POST «/projects/pro-/releases/release02/values/14» for 127.0.0.1 at 2013-12-13 08:39:37 -0200 Processing by IssueValuesController#update as HTML Parameters: «✓», «authenticity_token»=>»vuyP9Jwm4pS63OF7xucBHGo0L5m61ayj3aWcXYpFTKM=», «issue_value»=>»10,00», «client_value»=>»5,00″>, «commit»=>»Salvar», «project_id»=>»pro-«, «release_id»=>»release02», «id»=>»14″> SQL (0.5ms) SHOW TABLES User Load (0.1ms) SELECT users .* FROM users WHERE (( users . auth_token = ‘ji2lt8p1185q6q1l’ AND users . status_id = 2)) LIMIT 1 SQL (0.7ms) describe releases_browser_versions SQL (0.5ms) describe releases_os_versions SQL (0.6ms) describe releases_mobile_models Release Load (0.1ms) SELECT releases .* FROM releases WHERE releases . identifier = ‘release02’ LIMIT 1 IssueValue Load (0.2ms) SELECT issue_values .* FROM issue_values WHERE issue_values . id = 14 LIMIT 1 SQL (0.5ms) SHOW TABLES Project Load (0.1ms) SELECT projects .* FROM projects WHERE projects . identifier = ‘pro-‘ LIMIT 1 CACHE (0.0ms) SELECT issue_values .* FROM issue_values WHERE issue_values . id = 14 LIMIT 1 SQL (0.1ms) BEGIN SQL (0.1ms) COMMIT Completed 500 Internal Server Error in 784ms

ActionView::MissingTemplate (Missing template issue_values/show with [:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:pt, :pt]> in view paths «/var/www/base2_crowdtest/2112/final/trunk/app/views», «/usr/local/rvm/gems/ruby-1.9.3-p448/gems/client_side_validations-3.1.4/app/views», «/usr/local/rvm/gems/ruby-1.9.3-p448/gems/declarative_authorization-0.5.6/app/views», «/usr/local/rvm/gems/ruby-1.9.3-p448/gems/kaminari-0.13.0/app/views»): app/controllers/issue_values_controller.rb:12:in block (3 levels) in update’ app/controllers/issue_values_controller.rb:11:in block in update’ app/controllers/issue_values_controller.rb:9:in `update’

Rendered /usr/local/rvm/gems/ruby-1.9.3-p448/gems/actionpack-3.0.10/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (0.8ms)

Источник

Rails 5 API — How to respond with HTML on a specific controllers as an exception?

I have Rails API app. And 99% of the routes are JSON routes. however, I want to add one single route that will response with HTML. How can I do that? This is my current setup and when I browse the route I see a string of HTML tags on the screen.

class ApplicationController < ActionController::API include ActionController::MimeResponds end class DocumentPublicController < ApplicationController respond_to :html def show html = "

Holololo

"#, :content_type => 'text/html' respond_to do |format| format.html 'text/html'> end end end

2 Answers 2

When using html: option, HTML entities will be escaped if the string is not marked as HTML safe by using html_safe method.

So you just need to tell it the string is safe to render as html:

# modified this line, though could be done in the actual render call as well html = " 

Holololo

".html_safe respond_to do |format| format.html 'text/html'> end

Most new APIs only need to serve JSON, yet it is common to see respond_to in API controllers. Here is an example:

def show html = " 

Holololo

" respond_to do |format| format.html < render :json =>html > end end

We can drop the respond_to , but if you hit the url without .json you’ll see it thinking you’re using HTML in the logs

Processing by PeopleController#index as HTML 

If you want your route to respond as HTML, you can default that in the route to HTML

namespace :api, :defaults => :html> do namespace :v1 do resources :people end end 

So you can drop the respond_to and let it have its curse, then default your route to take effect as HTML.

Источник

Читайте также:  Requests utils в python
Оцените статью