Как Вы мешаете классу PHP выполниться?

Внутри все это делается через HTML. Я бы предложил использовать javascript.

  • Иметь один элемент div с таким идентификатором, как

    <div id="InterchangableView"></div>
    
  • Добавить событие onChange в раскрывающийся список и передать функции javascript значение dropdown

  • В функции определите, какое это значение, и вызовите необходимый метод контроллера, например, ниже

    if(id == 1)
    {
        var json = '{controllerParam: ' + id + '}';
    
        $.ajax({
            url:'@Url.Action("Action", "Controller")',
            type:'POST',
            data: json,
            contentType:'Application/json',
            success:fucntion(result){
                $("#InterchangableView").html(result);
            }
        });
    }
    
  • В действии контроллера, в зависимости от переданного в него результата, сделайте проверку и верните правильное частичное представление таким образом.

Каждый раз, когда выпадающий список изменяется, должен вызываться javascript, который должен возвращать частичный вид, который должен перезаписывать все, что находится в div, на котором расположен этот Id.

5
задан Don Kirkby 23 December 2008 в 21:11
поделиться

3 ответа

Просто возвратите другой класс, который возвратит $this для каждого названного метода.

Пример:

class NoMethods {
    public function __call($name, $args)
    {
        echo __METHOD__ . " called $name with " . count($args) . " arguments.\n";
        return $this;
    }
}

class Browser {
    public function runThis()
    {
        echo __METHOD__ . "\n";
        return $this;
    }

    public function stop()
    {
        echo __METHOD__ . "\n";
        return new NoMethods();
    }

    public function dontRunThis()
    {
        echo __METHOD__ . "\n";
        return $this;
    }
}

$browser = new Browser();
echo "with stop\n";
$browser->runThis()->stop()->dontRunThis()->dunno('hey');
echo "without stop\n";
$browser->runThis()->dontRunThis();
echo "the end\n";

Приведет к:

with stop
Browser::runThis
Browser::stop
NoMethods::__call called dontRunThis with 0 arguments.
NoMethods::__call called dunno with 1 arguments.
without stop
Browser::runThis
Browser::dontRunThis
the end
6
ответ дан 18 December 2019 в 09:54
поделиться

Вы могли использовать исключения PHP:

// This function would of course be declared in the class
function stop() {
    throw new Exception('Stopped.');
}

try {
    $browser->isStatusCode(200)
      ->isRequestParameter('module', 'home')
      ->isRequestParameter('action', 'index')
      ->click('Register')
      ->stop()
      ->I_DONT_WANT_THIS_TO_RUN();
} catch (Exception $e) {
    // when stop() throws the exception, control will go on from here.
}

$browser->thenThisRunsOkay();
10
ответ дан 18 December 2019 в 09:54
поделиться

Ответ OI действительно хорош, хотя я видел, что это могло бы стать сбивающим с толку, если объект внезапно изменяется на что-то еще. Таким образом, Вы ожидали бы, что в конце Вашей цепочки, закончите с тем же объектом. Избегать, чтобы проблема, я добавил бы частную переменную для сообщения класса, сделать ли на самом деле что-нибудь. Если класс был остановлен, то каждый класс просто возвращается $this немедленно. Это приносит Вам дополнительную пользу способности перезапустить выполнение.

class MyClass {
    private $halt;

    function __call($func, $args) {
        if ($this->halt) {
            return $this;
        } else {
            return $this->$func($args);
        }
    }

    private function isRequestParameter() {
        // ...
    }
    public function stop() {
        $this->halt = true;
    }
    public function start() {
        $this->halt = false;
    }
}

Это могло быть помещено в родительский класс, таким образом, Вы не должны копировать этот код.

1
ответ дан 18 December 2019 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: